你如何设置MySQLdate时间列的默认值?

你如何设置MySQLdate时间列的默认值?

在SQL Server中,它是getdate() 。 什么是MySQL的等价物? 如果这是一个因素,我正在使用MySQL 5.x。

重要的编辑:现在可以实现这一点,从DATETIME领域MySQL 5.6.5 ,看看下面的其他post …

以前的版本不能用DATETIME做到这一点…

但是你可以用TIMESTAMP做到这一点:

 mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.00 sec) mysql> desc test; +-------+-------------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+-------------------+-------+ | str | varchar(32) | YES | | NULL | | | ts | timestamp | NO | | CURRENT_TIMESTAMP | | +-------+-------------+------+-----+-------------------+-------+ 2 rows in set (0.00 sec) mysql> insert into test (str) values ("demo"); Query OK, 1 row affected (0.00 sec) mysql> select * from test; +------+---------------------+ | str | ts | +------+---------------------+ | demo | 2008-10-03 22:59:52 | +------+---------------------+ 1 row in set (0.00 sec) mysql> 

在版本5.6.5中,可以在date时间列上设置默认值,甚至可以创build一个在更新行时更新的列。 types定义:

 CREATE TABLE foo ( `creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP ) 

参考: http : //optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

MySQL( 版本5.6.5之前 )不允许将函数用于默认DateTime值。 由于其奇怪的行为,TIMESTAMP不适用,不build议用作input数据。 (请参阅MySQL数据types默认值 。)

也就是说,你可以通过创build一个Trigger来完成这个任务。

我有一个types为DateTime的DateCreated字段的表。 我在该表“插入前”和“ SET NEW.DateCreated=NOW() ”创build了一个触发器,它工作的很好。

我希望这有助于某人。

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

 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语句 – yuck! 要在提供值时覆盖此行为,请尝试使用IFNULL运算符稍微修改该触发器:

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

这给了两个世界的最好的:你可以提供一个值为您的date列,它会采取,否则它会默认为当前时间。 在表格定义中,它仍然是相对于像DEFAULT GETDATE()干净的东西而言的,但是我们正在接近!

我能够解决这个问题,在我的表有两个date时间字段使用这个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查询浏览器插入logging,则需要多一个步骤,用新的时间戳处理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]

你可以使用触发器来做这种types的东西。

 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; 

这确实是可怕的消息。 这是一个很长的挂起的bug /function请求 。 该讨论还讨论了时间戳数据types的局限性。

我真的很想知道实现这个东西有什么问题。

MySQL 5.6已经解决了这个问题 。

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

对于所有那些试图在MySQL中设置默认的DATETIME值的人来说,我完全知道你的感受/感受。 所以这里是:

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

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

我在解决这个问题后真的跳了起来:D

对于所有使用TIMESTAMP列作为解决scheme的人,我想从手册中获得以下限制:

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

“TIMESTAMP数据types的范围为'1970-01-01 00: 00:01'UTC到' 2038-01-19 03:14:07'UTC 。它具有不同的属性,具体取决于MySQL版本和SQL模式服务器正在运行。这些属性将在本节稍后介绍。

所以这显然会在28年左右破坏你的软件。

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

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

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

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

虽然你不能在默认定义中使用DATETIME来做到这一点,但是你可以简单地在你的insert语句中join一个select语句,如下所示:

 INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now())) 

请注意表中缺less引号。

对于MySQL 5.5

这里是如何在MySQL 5.1上做到的:

 ALTER TABLE `table_name` CHANGE `column_name` `column_name` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; 

我不知道为什么你必须input列名两次。

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

 CREATE TABLE `testtable` ( `id` INT(10) NULL DEFAULT NULL, `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12' ) 

在上面的查询创build“testing表”,我用'1999年12月12日12:12:12'作为DATETIME列colname默认值

我正在运行MySql Server 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文档中提到:

DATEtypes用于具有date部分但没有时间部分的值。 MySQL以'YYYY-MM-DD'格式检索并显示DATE值。 支持的范围是“1000-01-01”到“9999-12-31”。

即使他们也说:

无效的DATE,DATETIME或TIMESTAMP值将转换为相应types(“0000-00-00”或“0000-00-00 00:00:00”)的“零”值。

使用下面的代码

 DELIMITER $$ CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW BEGIN SET new.datefield = NOW(); END $$ DELIMITER ; 

如果你已经创build了表格,那么你可以使用

将默认值更改为当前date时间

 ALTER TABLE <TABLE_NAME> CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP; 

要将默认值更改为“2015-05-11 13:01:01”

 ALTER TABLE <TABLE_NAME> CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01'; 

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

举例来说,如果我有一个名为“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;

语句的顺序很重要,因为一个表不能有两个TIMESTAMPtypes的列,其默认值为CUREENT TIMESTAMP

这是我的触发器的例子:

 /************ ROLE ************/ drop table if exists `role`; create table `role` ( `id_role` bigint(20) unsigned not null auto_increment, `date_created` datetime, `date_deleted` datetime, `name` varchar(35) not null, `description` text, primary key (`id_role`) ) comment=''; drop trigger if exists `role_date_created`; create trigger `role_date_created` before insert on `role` for each row set new.`date_created` = now(); 

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