Invalid default value for 'create_date' timestamp field
我有以下SQL create语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| mysql > CREATE TABLE IF NOT EXISTS `erp`. `je_menus` (
-> `id` INT(11) NOT NULL AUTO_INCREMENT ,
-> `name` VARCHAR(100) NOT NULL ,
-> `description` VARCHAR(255) NOT NULL ,
-> `live_start_date` DATETIME NULL DEFAULT NULL ,
-> `live_end_date` DATETIME NULL DEFAULT NULL ,
-> `notes` VARCHAR(255) NULL ,
-> `create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
-> `created_by` INT(11) NOT NULL ,
-> `update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
-> `updated_by` INT(11) NOT NULL ,
-> `status` VARCHAR(45) NOT NULL ,
-> PRIMARY KEY (`id`) )
-> ENGINE = InnoDB; |
出现以下错误
ERROR 1067 (42000): Invalid default value for 'create_date'。
这里的错误是什么?
- 我看不出你的查询有什么问题,它在刚刚测试过的5.1.50社区上工作。
- 我最后也没问题。
- 不确定,但请为该字段指定一个不同的名称并尝试?
- 我在Ubuntu10.04中使用mysql 5.1.56社区。而且不工作
- 非零日期需要日期。使用"1970-01-01 00:00:01"。[从这里拍摄][1][1]:dba.stackexchange.com/questions/6171/…
这是因为服务器SQL模式-没有零日期。
从参考文献中:NO_ZERO_DATE—在严格模式下,不允许'0000-00-00'作为有效日期。您仍然可以使用忽略选项插入零日期。如果不是严格模式,则接受日期,但会生成警告。
- 我如何给忽略选项?
- 不能忽略此选项。这是服务器选项。如果您有权访问my.ini(my sql配置文件),那么从SQL模式选项中删除no_zero_date并重新启动服务器。
- 若要选中此选项,请运行show variables,如'sql_mode'
- 我使用mysql工作台生成了这个脚本。在脚本中,SQL_模式设置为传统模式。如果我去掉传统的,脚本就可以工作了。
- 在mysql工作台首选项中,转到选项卡"model:mysql"。将"生成脚本中要使用的SQL_模式"设置为"严格的事务表、不自动创建用户、不替换引擎‌&8203;ion",这样可以很好地解决问题。
- 您可以使用命令检查您的SQL_模式(注意有两个级别):select@@global.sql_模式;select@@session.sql_模式;
如果从MySQL工作台生成脚本。
生成以下行
1
| SET @OLD_SQL_MODE =@@SQL_MODE , SQL_MODE ='TRADITIONAL,ALLOW_INVALID_DATES'; |
从SQL_模式中删除传统模式,然后脚本应该可以正常工作。
否则,您可以将SQL_模式设置为允许无效日期。
1
| SET SQL_MODE ='ALLOW_INVALID_DATES'; |
号
- 省去了我一点时间去寻找它为什么不起作用:)
- 啊,谢谢。set-sql_-mode='allow_-invalid_-dates'是一个生命保护程序。当我尝试将一个WordPress站点迁移到另一个服务器(都是本地服务器)时,出现了这个问题,并且由于这个错误,它不会允许我导入数据库数据,即使表中没有出现此错误的行。
时间戳的范围是"1970-01-01 00:00:01"UTC到"2038-01-19 03:14:07"UTC(请参阅文档)。默认值必须在该范围内。
其他奇怪的、相关的、行为:
侧注,如果要插入空值:
。
- 这发生在我身上。怎么回事?TS2甚至不是"非空"…!
- 可能是因为"如果没有为表中的第一个时间戳列设置值,则在对相关行执行更新或插入查询时,Mariadb将自动为其分配当前日期和时间。"–Mariadb文档
- 我喜欢使用column_name TIMESTAMP DEFAULT NOW()。可能不适合每一种情况,但我认为我会分享,因为我也在处理这件事。
- 列"name timestamp default""1970-01-01 00:00:01"对我起了作用。谢谢!
在Ubuntu桌面16.04中,我这样做了:
打开文件:/etc/mysql/mysql.conf.d/mysqld.cnf在您选择的编辑器中。
寻找:sql_mode,它将在[mysqld]下面的某个地方。
将sql_mode设置为:
埃多克斯1〔6〕
保存并重新启动MySQL服务,方法是:
江户十一〔七〕号
- 它确实起了作用,除了我在Ubuntu16.04上的mysql实例中没有sql_mode的存在。我必须在文件中添加一个条目,删除"不归零日期"。现在的情况是这样的:添加下面的一行以摆脱没有零日期的SQL_模式=仅由完整的分组,严格的跨表,没有零日期,错误‌&35;;_divisiu的u-divisiu的u-date,错误‌‌‌‌&35 35; 8203;o,没有自动创建使用‌&8203;r,没有引擎替换‌&替换‌&35;8203;操作
- 你是对的。。我在前面添加了它以禁用严格模式。当我为这个特定的问题编辑它时,sql_mode条目已经存在了。
- 这是虫子吗?当前的时间戳不应该返回"0000-00-00 00:00:00",或者我错了?为什么我必须更改mysqld设置?
- @因为有人错误地配置了你的MySQL服务器。我用导入的数据库来解决这个问题。列中时间戳的默认值不是有效的时间戳值。真正的解决方法是将默认时间戳更新为有效的时间戳,比如1970年——最早的可用日期。临时解决方法是禁用对数据库的检查。
我可以在OS X上通过从自制安装mysql来解决这个问题。
。
在/usr/local/etc/my.cnf中添加以下内容
1
| sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
重启mysql
1 2
| brew tap homebrew/services
brew services restart mysql |
。
使用OS X,从Homebrew安装MySQL,系统变量基于其默认编译。解决方案是从系统变量"SQL模式"中删除"无零日期"。
请记住范围涉及。
如果您只想在您的会话中产生影响,请使用"@@session",例如:
1
| SET @@ session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION". |
在这种情况下,一旦会话结束或更改会话,它将不会受到影响。它对其他会话没有影响。
如果您想影响所有客户,请使用"@@global",例如:
1
| SET @@ global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION". |
。
在这种情况下,它只影响更改后连接的客户机(不影响当前所有客户机),一旦服务器退出,它将不工作。
为了避免这个问题,您需要从mysql模式配置中删除NO_ZERO_DATE。
转到"phpmyadmin"。
加载phpmyadmin后,单击"变量"选项卡。
搜索"SQL模式"。
单击编辑选项并从配置中删除NO_ZERO_DATE(及其尾随逗号)。
这是本地环境中使用WAMP或XAMP时非常常见的问题。
我对MySQL5.7也有类似的问题,代码如下:
埃多克斯1〔10〕
我改为使用这个:
江户十一〔11〕。
- 我认为这实际上是最好的选择,当它确实有意义默认为当前,但它不会有意义的出生时间戳-就像一个例子。
只需在数据库SQL文件的顶部定义以下行。
1 2
| SET SQL_MODE ="NO_AUTO_VALUE_ON_ZERO";
SET time_zone ="+00:00"; |
号
它对我有效。
禁用严格的SQL模式
1
| Create disable_strict_mode.cnf file at /etc /mysql /conf.d / |
号
在文件中,输入以下两行:
1 2
| [mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
号
最后,使用以下命令重新启动mysql:
1
| sudo service mysql restart |
号
您可能需要检查mysql实例上的时区设置:
1 2 3 4 5 6
| mysql > show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | SYSTEM |
+---------------+--------+ |
在我的例子中,我意识到底层系统的时区设置为BST而不是UTC,因此在创建表中,"1970-01-01 00:00:01"的默认值被强制后退1小时,导致时间戳值无效。
对我来说,我实际上想把机器的时区设置为UTC,这就解决了我的问题。当我运行CentOS/7时,我只是
1
| # timedatectl set-timezone UTC |
。
重新启动一切。
默认值应该从1000年开始。
例如,
号
希望这能帮助别人。
你可以改变这个:
号
像这样的事情:
号