【问题标题】:Set NOW() as Default Value for datetime datatype?将 NOW() 设置为日期时间数据类型的默认值?
【发布时间】:2011-08-14 16:12:45
【问题描述】:

我在表用户中有两列,即registerDate and lastVisitDate,它们由日期时间数据类型组成。我想做以下事情。

  1. 将 registerDate 默认值设置为 MySQL NOW()
  2. 将 lastVisitDate 默认值设置为0000-00-00 00:00:00,而不是默认使用的 null。

由于表已经存在并且已有记录,我想使用修改表。我试过使用下面的两段代码,但都不起作用。

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

它给了我错误:ERROR 1067 (42000): Invalid default value for 'registerDate'

我可以在 MySQL 中将默认日期时间值设置为 NOW() 吗?

【问题讨论】:

  • ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP。您在这两项工作中都没有定义 data type 字段
  • 因为 MySQL 5.6 DATE 应该使用默认值 NOW()
  • 根据这个 mysql 5.6 文档:dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html,您可以默认使用 CURRENT_TIMESTAMP()。
  • 我将如何实现 CURRENT_TIMESTAMP + 1 DAY

标签: mysql sql datetime mysql-error-1067


【解决方案1】:

从 MySQL 5.6.5 开始,您可以使用带有动态默认值的 DATETIME 类型:

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

或者甚至结合两个规则:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

参考:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

在 5.6.5 之前,您需要使用 TIMESTAMP 数据类型,它会在记录被修改时自动更新。然而不幸的是,每个表只能存在一个自动更新的TIMESTAMP 字段。

CREATE TABLE mytable (
  mydate TIMESTAMP
)

见:http://dev.mysql.com/doc/refman/5.1/en/create-table.html

如果您想阻止 MySQL 更新 UPDATE 上的时间戳值(使其仅在 INSERT 上触发),您可以将定义更改为:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

【讨论】:

  • 我真的不想使用时间戳。
  • @Ibrahim:时间戳是你唯一的机会。如果您使用日期时间字段,则必须每次都使用 now() 插入记录。
  • 手册说得很清楚:“这意味着,例如,您不能将日期列的默认值设置为 NOW() 或 CURRENT_DATE 等函数的值”。
  • @Johan DATETIME 通常更喜欢做它可以容纳的范围:'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' 比较到 TIMESTAMPS 的 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。用于存储出生日期或未来 30 年以上的日期。
  • @nickrulez 从 MySQL 5.6 开始,您不再受限于 timestamp 进行此行为
【解决方案2】:

我使用触发器作为解决方法,将日期时间字段设置为 NOW() 以进行新插入:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

它也应该适用于更新

Johan 和 Leonardo 的回答涉及转换为时间戳字段。虽然这对于问题中提出的用例(存储 RegisterDate 和 LastVisitDate)可能没问题,但它不是一个通用的解决方案。请参阅datetime vs timestamp 问题。

【讨论】:

  • 这应该是公认的答案,但特别是您应该对其进行编辑以使其明显适用于日期时间字段。原贴想知道如何解决一个日期时间字段,如果你真的了解这两种数据类型之间的区别,use a timestamp 是一个愚蠢的解决方法。
【解决方案3】:

我的解决方案

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;

【讨论】:

  • 这个 def 有效,我推荐大家使用 SQLYog 或类似的工具,它可以让你在一个简单的界面上做这些事情。
  • 这仍然是TIMESTAMP 列的解决方案。没有人要求TIMESTAMP ...
  • 是的,这不是问题的答案。 TIMESTAMP 是与 DATETIME 不同的字段类型。
  • @Leonardo 我怎样才能只显示日期
【解决方案4】:

尤里卡!!!


对于那些试图在 MySQL 中设置一个默认 DATETIME 值而灰心丧气的人,我完全了解您的感受/感受。所以这里是:

`ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

仔细观察我没有在0周围添加单引号/双引号


重要更新

这个答案很久以前就发布了。那时,它适用于我(可能是最新的)MySQL 安装,我想分享它。在您决定立即使用此解决方案之前,请先阅读下面的 cmets。

【讨论】:

  • 这取决于期望... - 此解决方案允许您拥有字段 NOT NULL,因为提供了默认值。 - 此解决方案不会将该字段设置为 NOW()。
  • 这没有回答原来的问题;答案应该清楚地说明这一点。
  • 注意TRADITIONAL SQL模式包含NO_ZERO_DATE,所以在这种情况下上述方法不起作用。
  • 根据提供的答案,听起来如果您不会牺牲 DATETIME 成为 TIMESTAMP,那么您必须使用触发器。
  • 这个解决方案将有一些疯狂的 api,“天哪,它是零日期!多么异端!我们无法将 'this' 转换为 java.lang.Date/System.DateTime!天哪!-崩溃-”。
【解决方案5】:

在 mysql 5.6.5 和更高版本上,您也可以使用精确的日期时间并设置默认值。不过有一点很微妙,就是将精度值传递给 datetime 和 NOW() 函数调用。

此示例有效:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

这个例子不起作用:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();

【讨论】:

    【解决方案6】:

    mysql 5.6 文档说 CURRENT_TIMESTAMP 可以用作 TIMESTAMP 和 DATETIME 数据类型的默认值:

    http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

    【讨论】:

    • 正好从 5.6.5 开始,因为我有 5.6.22,如果它是 5.6,它就不起作用。太糟糕了。
    【解决方案7】:
    `ALTER TABLE  `table_name` CHANGE `column_name` 
        timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP
    

    可用于在更新时更新时间戳。

    【讨论】:

      【解决方案8】:

      最好的方法是使用“DEFAULT 0”。 其他方式:

          /************ ROLE ************/
          drop table if exists `role`;
          create table `role` (
              `id_role` bigint(20) unsigned not null auto_increment,
              `date_created` datetime,
              `date_deleted` datetime,
              `name` varchar(35) not null,
              `description` text,
              primary key (`id_role`)
          ) comment='';
      
          drop trigger if exists `role_date_created`;
          create trigger `role_date_created` before insert
              on `role`
              for each row 
              set new.`date_created` = now();
      

      【讨论】:

        【解决方案9】:

        这对我有用,使用 MySQL:

        ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
        

        【讨论】:

          【解决方案10】:
          ALTER TABLE table_name
            CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
          

          最后,这对我有用!

          【讨论】:

            【解决方案11】:
            CREATE TABLE `users` (
              `id` int(11) NOT NULL AUTO_INCREMENT,
              `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
              `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
              PRIMARY KEY (`id`),
              UNIQUE KEY `mobile_UNIQUE` (`mobile`)
            ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
            

            【讨论】:

              【解决方案12】:

              不确定这是否仍然有效,但可以。

              关于将默认值设置为 Now(),我认为这对于 DATETIME 数据类型是不可能的。如果您想使用该数据类型,请在执行插入时设置日期,如下所示:

              INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
              

              我的 mySQL 版本是 5.5

              【讨论】:

              • 可以简化为:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
              【解决方案13】:

              这对我有用 - 只是将我的表的 INSERT 更改为 UPDATE。

              INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-09-06
                • 2020-03-25
                • 2010-09-17
                • 2021-01-07
                • 1970-01-01
                • 2014-02-16
                • 2022-12-05
                相关资源
                最近更新 更多