你如何设置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你是客户区。 这一步是强制性的。