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

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


当前回答

如果你设置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.7.11和这句话:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

不起作用。但下面是:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

只是工作。

作为旁注,mysql文档中提到:

DATE类型用于有日期部分但没有时间部分的值。MySQL以'YYYY-MM-DD'格式检索并显示DATE值。支持的范围为1000-01-01 ~ 99999-12-31。

即使他们还说:

无效的DATE、DATETIME或TIMESTAMP值被转换为适当类型的“零”值('0000-00-00'或'0000-00-00 00:00:00')。

如果你试图将默认值设置为NOW(),我认为MySQL不支持。在MySQL中,您不能使用函数或表达式作为任何类型列的默认值,除了TIMESTAMP数据类型列,您可以为其指定CURRENT_TIMESTAMP作为默认值。

你可以使用触发器来做这类事情。

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

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

对于那些试图在MySQL中设置默认DATETIME值而失去信心的人,我确切地知道你的感受。这就是:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

仔细观察,我没有在0周围添加单引号/双引号

解完这个题,我真的跳了起来,D