Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 是否将NOW()设置为datetime数据类型的默认值?_Mysql_Sql_Datetime_Mysql Error 1067 - Fatal编程技术网

Mysql 是否将NOW()设置为datetime数据类型的默认值?

Mysql 是否将NOW()设置为datetime数据类型的默认值?,mysql,sql,datetime,mysql-error-1067,Mysql,Sql,Datetime,Mysql Error 1067,我在表users中有两列,即registerDate和lastVisitDate,它们由日期时间数据类型组成。我想做以下几点 将registerDate默认值设置为MySQL NOW() 将lastVisitDate默认值设置为0000-00-00:00:00,而不是默认使用的null 因为该表已经存在并且有现有记录,所以我想使用Modify table。我尝试过使用下面的两段代码,但两段代码都不起作用 ALTER TABLE users MODIFY registerDate datetime

我在表users中有两列,即
registerDate和lastVisitDate
,它们由日期时间数据类型组成。我想做以下几点

  • 将registerDate默认值设置为MySQL NOW()
  • 将lastVisitDate默认值设置为
    0000-00-00:00:00
    ,而不是默认使用的null
  • 因为该表已经存在并且有现有记录,所以我想使用Modify table。我尝试过使用下面的两段代码,但两段代码都不起作用

    ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
    ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;
    
    它给了我错误:
    Error 1067(42000):“registerDate”的默认值无效。


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

    从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
    
    参考资料:

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

    CREATE TABLE mytable (
      mydate TIMESTAMP
    )
    
    见:

    如果要防止MySQL在
    UPDATE
    上更新时间戳值(这样它只在
    INSERT
    上触发),可以将定义更改为:

    CREATE TABLE mytable (
      mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
    
    尤里卡
    对于那些试图在MySQL中设置默认日期时间值的人来说,我非常清楚你的感受。这就是:

    `ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
    
    仔细观察我没有在0周围添加单引号/双引号


    重要更新


    这个答案很久以前就公布了。当时,它在我(可能是最新)安装的MySQL上工作,我很想分享它。在决定现在使用此解决方案之前,请阅读下面的评论。

    不确定此解决方案是否仍处于活动状态,但现在开始

    关于将默认值设置为Now(),我认为DATETIME数据类型不可能这样。如果要使用该数据类型,请按如下方式设置执行插入的日期:

    INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
    
    INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
    
    我的mySQL版本是5.5

    我的解决方案

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

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

    我使用触发器作为解决方法,将datetime字段设置为NOW(),以用于新插入:

    CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
    FOR EACH ROW 
    SET NEW.datetimefield = NOW()
    
    它应该也适用于更新

    Johan&Leonardo的答案涉及转换为时间戳字段。尽管这对于问题中提出的用例(存储RegisterDate和LastVisitDate)来说可能还可以,但它不是一个通用的解决方案。请参阅问题。

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

    /**********角色************/
    如果存在“角色”,则删除表;
    创建表“角色”(
    `id_role`bigint(20)无符号非空自动增量,
    `date_created`datetime,
    `date_deleted`datetime,
    `name`varchar(35)不为空,
    `说明`正文,
    主键(`id\u role`)
    )评论=“”;
    如果存在“角色\u创建日期”,则删除触发器;
    在插入之前创建触发器“角色\创建日期”
    关于`角色`
    每行
    设置新。`date_created`=now();
    
    mysql 5.6文档说,当前时间戳可以用作时间戳和日期时间数据类型的默认值:


    在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();
    

    这对我来说很有效,使用MySQL:

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

    这对我很有用-只是将INSERT更改为更新我的表



    终于,我成功了

    我真的不想使用时间戳。@Ibrahim:时间戳是你唯一的机会。如果使用datetime字段,则每次都必须使用now()插入记录。Manual说得很清楚:“例如,这意味着您不能将日期列的默认值设置为函数的值,例如now()或CURRENT_date”与时间戳相比,@Johan
    DATETIME
    通常更倾向于选择它能容纳的范围:“1000-01-01 00:00:00”到“9999-12-31 23:59:59”,而时间戳则是从UTC的“1970-01-01 00:00:01”到UTC的“2038-01-19 03:14:07”。为了存储出生日期或未来30年以上的数据。@nickrulez从MySQL 5.6开始,对于这种行为,您不再被限制为
    时间戳
    。ALTER TABLE users MODIFY dateTime timestamp default CURRENT timestamp。您没有在MySQL 5.6中定义
    数据类型
    字段。MySQL 5.6
    日期
    应使用默认值
    NOW()
    根据此MySQL 5.6文档:,您可以使用当前时间戳()作为默认值。如何实现当前时间戳+1天可以简化为:
    插入到您的表中(Field1,YourDateField)值('val1',NOW())
    这取决于期望值…-此解决方案允许字段不为NULL,因为提供了默认值。-此解决方案不会将字段设置为NOW()。这并没有回答最初的问题;答案应该清楚地说明这一点。请注意,传统的SQL模式包含NO_ZERO_DATE,因此在这种情况下上述方法将不起作用。根据提供的答案,听起来如果您不想牺牲DATETIME作为时间戳,那么您必须使用触发器。此解决方案将有一些API“天哪,这是零日期!多么异端!我们不能将‘this’转换为java.lang.date/System.DateTime!天哪!-崩溃——”。这个定义很有效,我建议每个人都使用SQLYG或类似的工具,它可以让你在一个简单的界面上完成这项工作。这仍然是
    时间戳
    列的解决方案。没有人要求
    时间戳
    。。是的,这不是问题的答案。时间戳与DATETIME是不同类型的字段。@Leonardo我如何显示只有日期这应该是公认的答案,但特别是
    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;
    
    ALTER TABLE table_name
      CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
    
    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;