如何设置MySQL Datetime列的默认值?

在SQL Server中是getdate()。MySQL的等价物是什么?我使用MySQL 5。X,如果它是因式。


当前回答

MySQL 5.6已经修复了这个问题。

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'

其他回答

如果你设置ON UPDATE CURRENT_TIMESTAMP,当表中的行数据更新时,它将占用当前时间。

 CREATE TABLE bar(
        `create_time` TIMESTAMP CURRENT_TIMESTAMP,
        `update_time` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    )

对我来说,触发方法是最有效的,但我发现这种方法有一个障碍。考虑将date字段设置为insert的当前时间的基本触发器:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

这通常很好,但如果你想通过INSERT语句手动设置字段,如下所示:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

触发器会立即覆盖您为字段提供的值,因此设置非当前时间的唯一方法是后续的UPDATE语句——真糟糕!要在提供值时覆盖此行为,请尝试使用IFNULL操作符略微修改的触发器:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

这提供了两个世界的最佳:您可以为日期列提供一个值,它将接受,否则它将默认为当前时间。相对于表定义中的DEFAULT GETDATE()之类的干净的东西,它仍然是ghetto,但我们越来越接近了!

MySQL 5.6已经修复了这个问题。

ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'

MySQL(5.6.5版本之前)不允许将函数用于默认的DateTime值。由于其奇怪的行为,TIMESTAMP不适合使用,不建议用作输入数据。(参见MySQL数据类型默认值。)

也就是说,您可以通过创建触发器来实现这一点。

我有一个DateCreated字段类型为DateTime的表。我在那个表上创建了一个触发器“Before Insert”和“SET NEW.DateCreated=NOW()”,它工作得很好。

如果我有一个名为“site”的表,其中created_at和update_at列都是DATETIME,并且需要现在的默认值,我可以执行以下sql来实现这一点。

ALTER TABLE `site` CHANGE `created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `created_at` `created_at` DATETIME  NULL DEFAULT NULL;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` DATETIME NULL DEFAULT  NULL;

语句序列很重要,因为一个表不能有两个TIMESTAMP类型的列,且默认值为CUREENT TIMESTAMP