如何为MySQL Datetime列设置默认值?
在SQL Server中,使用getdate()
设置默认值。那么在MySQL中该怎么做呢?我正在使用MySQL 5.x版本。
如何为MySQL Datetime列设置默认值?
在SQL Server中,使用getdate()
设置默认值。那么在MySQL中该怎么做呢?我正在使用MySQL 5.x版本。
重要编辑:自MySQL 5.6.5版本开始,使用DATETIME字段可以实现这一点,请查看下面的其他帖子...
早期版本无法使用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>
注意:如果你定义一个默认为CURRENT_TIMESTAMP的列,那么你必须总是为这个列指定一个值,否则在更新时该列的值会自动重置为"now()"。这意味着,如果你不想改变这个值,在UPDATE语句中必须包含"[你的列名] = [你的列名]"(或其他某个值),否则该值将变为"now()"。虽然奇怪,但确实如此。我正在使用5.5.56-MariaDB。
DATE
类型的列设置默认值?(不是 datetime
列) - Sajib Acharyamydate DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
。根据文档和我的尝试。- https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html - Curtis Yallop在5.6.5版本中,可以在datetime列上设置默认值,并且甚至可以创建一个在行更新时也会更新的列。类型定义:
CREATE TABLE foo (
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
)
Reference: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
。 - Dan BoughMySQL(5.6.5版本之前)不允许在默认DateTime值中使用函数。由于其奇怪的行为,TIMESTAMP不适合作为输入数据,并且不建议使用。(请参见MySQL数据类型默认值。)
话虽如此,您可以通过创建触发器来实现此目的。
我有一个类型为DateTime的DateCreated字段的表。我在该表上创建了一个触发器“Before Insert”和“SET NEW.DateCreated = NOW()
”,效果非常好。
对我来说,触发器方法效果最好,但是我发现了这种方法的一个问题。考虑基本触发器,在插入时将日期字段设置为当前时间:
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()之类的清晰方法相比,它仍然不够完美,但我们正在逐渐接近!
FOR EACH ROW IF NEW.dateAdded = 0 THEN SET NEW.dateAdded = NOW(); END IF;
- KenneyALTER 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()函数的期望相同。如果插入null值或忽略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]
对于那些在尝试设置默认的DATETIME值时感到沮丧的人,我知道你们的心情。这里是方法:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
仔细观察,我没有在0周围添加单引号/双引号
我真的很高兴解决了这个问题:D
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
- Smith你可以使用触发器来完成这种操作。
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;
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';
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
这确实是个坏消息。这里是一个长期未解决的Bug / 功能请求讨论了时间戳数据类型的限制。
我真的很想知道为什么无法实现这个功能。