如何设置MySQL Datetime列的默认值?
在SQL Server中是getdate()。MySQL的等价物是什么?我使用MySQL 5。X,如果它是因式。
如何设置MySQL Datetime列的默认值?
在SQL Server中是getdate()。MySQL的等价物是什么?我使用MySQL 5。X,如果它是因式。
当前回答
对我来说,触发方法是最有效的,但我发现这种方法有一个障碍。考虑将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')。
重要的编辑: 自从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 ON的列,你需要为这个列指定一个ALWAYS值,否则这个值会在更新时自动重置为"now()"。这意味着如果你不想改变这个值,你的UPDATE语句必须包含"[你的列名]=[你的列名]"(或其他值),否则这个值就会变成"now()"。很奇怪,但却是事实。我使用的是5.5.56-MariaDB
我可以在有两个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]
MySQL 5.6已经修复了这个问题。
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
如果已经创建了表,则可以使用
更改默认值为当前日期时间
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';