如何设置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 ON的列,你需要为这个列指定一个ALWAYS值,否则这个值会在更新时自动重置为"now()"。这意味着如果你不想改变这个值,你的UPDATE语句必须包含"[你的列名]=[你的列名]"(或其他值),否则这个值就会变成"now()"。很奇怪,但却是事实。我使用的是5.5.56-MariaDB
其他回答
MySQL 5.6已经修复了这个问题。
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
你可以使用触发器来做这类事情。
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;
如果你设置ON UPDATE CURRENT_TIMESTAMP,当表中的行数据更新时,它将占用当前时间。
CREATE TABLE bar(
`create_time` TIMESTAMP CURRENT_TIMESTAMP,
`update_time` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
下面是如何在MySQL 5.1上做到这一点:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_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年内破坏你的软件。
我认为数据库方面的唯一解决方案是使用其他答案中提到的触发器。