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

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


当前回答

对我来说,触发方法是最有效的,但我发现这种方法有一个障碍。考虑将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,但我们越来越接近了!

其他回答

可以解析默认时间戳。首先考虑你使用的字符集,例如,如果你使用utf8,这个字符集支持所有语言,如果你使用laten1,这个字符集只支持英语。下一步,如果您在任何项目下工作,您应该知道客户端时区,并选择您所在的客户端时区。此步骤是强制执行的。

您可以使用now()来设置datetime列的值,但请记住,不能将其用作默认值。

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

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

在定义多行触发器时,必须将分隔符更改为分号,MySQL编译器将其作为触发器的结束并生成错误。 如。

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;

这是我的触发器示例:

/************角色************/ 删除存在' role '的表; 创建表' role ' ( bigint(20) unsigned not null auto_increment date_created datetime, date_deleted datetime, ' name ' varchar(35)不是空的, “描述”文本, 主键(' id_role ') )评论= "; 如果role_date_created存在,删除触发器; 在插入之前创建触发器' role_date_created ' “角色” 对于每一行 新设置。' date_created ' = now();