如何设置MySQL Datetime列的默认值?

在SQL Server中是getdate()。MySQL的等价物是什么?我使用MySQL 5。X,如果它是因式。


当前回答

如果我有一个名为“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;

语句序列很重要,因为一个表不能有两个TIMESTAMP类型的列,且默认值为CUREENT TIMESTAMP

其他回答

下面是如何在MySQL 5.1上做到这一点:

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

我不知道为什么您必须输入两次列名。

我认为在mysql中很简单,因为mysql的内置函数称为now(),它给出当前时间(插入的时间)。

因此,您的查询应该类似

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

谢谢你!

重要的编辑: 自从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

如果已经创建了表,则可以使用

更改默认值为当前日期时间

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';

对于所有使用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年内破坏你的软件。

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