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

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


当前回答

如果您试图将默认值设置为NOW(),MySQL支持您必须更改该列的类型TIMESTAMP而不是DATETIME。TIMESTAMP默认有当前日期和时间..我认为它将解决你的问题。

其他回答

如果您试图将默认值设置为NOW(),MySQL支持您必须更改该列的类型TIMESTAMP而不是DATETIME。TIMESTAMP默认有当前日期和时间..我认为它将解决你的问题。

对于所有使用TIMESTAMP列作为解决方案的人,我想从手册中提出以下限制:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

TIMESTAMP数据类型的范围是'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC。它具有不同的属性,这取决于MySQL版本和服务器运行的SQL模式。这些属性将在本节后面描述。”

这显然会在28年内破坏你的软件。

我认为数据库方面的唯一解决方案是使用其他答案中提到的触发器。

我可以在有两个datetime字段的表上使用这个alter语句来解决这个问题。

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

这与您期望now()函数的工作方式一样。插入空值或忽略created_dt和updated_dt字段会在两个字段中产生完美的时间戳值。对该行的任何更新都会改变updated_dt。如果您通过MySQL查询浏览器插入记录,那么还需要一个触发器来处理带有新时间戳的created_dt。

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

触发器可以是任何你想要的,我只是喜欢命名约定[trig]_[my_table_name]_[insert]

这是我的触发器示例:

/************角色************/ 删除存在' 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();

我认为在mysql中很简单,因为mysql的内置函数称为now(),它给出当前时间(插入的时间)。

因此,您的查询应该类似

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

谢谢你!