Mysql ';的默认值无效;创建日期';时间戳字段
我有以下sql create语句Mysql ';的默认值无效;创建日期';时间戳字段,mysql,Mysql,我有以下sql create语句 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` DA
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;
给出下列错误
错误1067(42000):“创建日期”的默认值无效。
这里的错误是什么?这是因为服务器SQL模式-
参考资料:
无零日期
-在严格模式下,不允许将'0000-00-00'
作为有效日期。您仍然可以使用“忽略”选项插入零日期。如果不是在严格模式下,则接受日期,但会生成警告。如果从MySQL工作台生成脚本
生成以下行
SET@OLD\u SQL\u MODE=@@SQL\u MODE,SQL\u MODE='TRADITIONAL,ALLOW_INVALID_DATES';
从SQL_模式中删除传统脚本,那么脚本就可以正常工作了
否则,您可以将SQL_模式设置为允许无效日期
SET SQL_MODE='ALLOW_INVALID_DATES';
时间戳的范围为“1970-01-01 00:00:01”UTC到“2038-01-19 03:14:07”UTC(请参阅)。默认值必须在该范围内
其他奇怪的、相关的行为:
CREATE TABLE tbl1 (
ts TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)
CREATE TABLE tbl2 (
ts TIMESTAMP,
ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'
CREATE TABLE tbl3 (
ts TIMESTAMP,
ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)
侧注,如果要插入空值:
CREATE TABLE tbl4 (
ts TIMESTAMP NULL DEFAULT NULL);
在ubuntu desktop 16.04中,我做到了以下几点:
/etc/mysql/mysql.conf.d/mysqld.cnf
sql\u模式
,它将位于[mysqld]
下的某个位置sql\u模式设置为以下值:
`create_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
日期中无0,按0除法错误,无自动创建用户,无引擎替换
sudo服务mysql重启
使用OSX,从Homebrew安装mysql,系统变量基于默认编译的mysql。 解决方案是从系统变量“sql模式”中删除“无零日期” 只是请记住,范围涉及 如果只想在会话中生效,请使用
“@@session”
,例如:
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".
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".
在这种情况下,一旦会话结束或更改它,它将不会影响。它对其他会话没有影响
如果要影响所有客户端,请使用“@@global”
,例如:
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".
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在OS X上解决了这个问题
brew install mysql
通过将以下内容添加到/usr/local/etc/my.cnf
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
brew tap homebrew/services
brew services restart mysql
您可能希望检查MySql实例上的时区设置:
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | SYSTEM |
+---------------+--------+
在我的例子中,我意识到基础系统将其时区设置为BST而不是UTC,因此在create表格中,默认值“1970-01-01 00:00:01”被强制返回1小时,导致时间戳值无效
对我来说,我真的希望机器的时区设置为UTC,这就解决了我的问题。当我运行Centos/7时,我只是简单地做到了
# timedatectl set-timezone UTC
并重新启动了所有程序。我在MySQL 5.7中遇到了类似的问题,代码如下:
`update\u date`时间戳(3)不为空默认当前时间戳
我改为使用此选项进行修复:
`update\u date`TIMESTAMP NOT NULL默认当前时间戳
禁用严格SQL模式
Create disable_strict_mode.cnf file at /etc/mysql/conf.d/
在文件中,输入以下两行:
[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:
sudo service mysql restart
为了避免这个问题,您需要从mysql模式配置中删除
NO_ZERO_DATE
NO_ZERO_DATE
(及其尾部逗号)这是wamp或xamp在本地环境中非常常见的问题。您只需更改以下内容:
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
对这样的事情:
`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
默认值应从1000年开始 比如说,
ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'
希望这对其他人有所帮助。只需在数据库SQL文件顶部定义以下行即可
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
它对我有用。更改此选项:
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
对下列事项:
`create_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
你可以改变这个:
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
create_date
datetime非空默认值“0000-00-00 00:00:00”
对这样的事情:
`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
create_date
varchar(80)非空默认值“0000-00-00:00:00”,我尝试将列的类型设置为“timestamp”,它对我有效。我看不出你的查询有任何错误,它在刚刚测试的5.1.50社区上有效。我的查询也没问题。不确定,但给该字段指定一个不同的名称,然后再试一次?我在ubuntu 10.04中使用mysql 5.1.56社区。不工作没有零日期需要一个日期。使用“1970-01-01 00:00:01”。[取自此处][1][1]:如何赋予忽略选项?您不能忽略此选项。这是服务器选项。如果您有权访问my.ini(mysql配置文件),请从sql模式选项中删除NO_ZERO_DATE并重新启动服务器。要检查此选项,请运行SHOW VARIABLES,如“sql_mode”,我使用mysql workbench生成了脚本。在脚本中,sql_模式设置为传统模式。如果我删除了传统的,脚本就可以工作了。在MySQL工作台首选项中,转到“Model:MySQL”选项卡。将“在生成的脚本中使用SQL模式”设置为“严格的转换表,没有自动创建用户,没有引擎替换”,这就很好地解决了问题。节省了我一些时间来搜索它为什么不工作:)啊,谢谢。设置SQL_MODE='ALLOW_INVALID_DATES';他是个救命恩人。当我尝试将wordpress站点迁移到另一台服务器(都是本地服务器)时,遇到了这个问题,由于这个错误,它不允许我导入数据库数据,即使表中没有出现这个错误的行。工作非常顺利!谢谢。设置SQL_MODE='ALLOW_INVALID_DATES';执行查询之前的技巧是否有帮助,除了sql\u模式
不适用于我的实例o