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

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


当前回答

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

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

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

其他回答

MySQL(5.6.5版本之前)不允许将函数用于默认的DateTime值。由于其奇怪的行为,TIMESTAMP不适合使用,不建议用作输入数据。(参见MySQL数据类型默认值。)

也就是说,您可以通过创建触发器来实现这一点。

我有一个DateCreated字段类型为DateTime的表。我在那个表上创建了一个触发器“Before Insert”和“SET NEW.DateCreated=NOW()”,它工作得很好。

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

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

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

我可以在有两个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编译器将其作为触发器的结束并生成错误。 如。

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;

您可以使用now()来设置datetime列的值,但请记住,不能将其用作默认值。