我有以下sql create statement
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'
这里有什么错误?
答案 0 :(得分:149)
这是因为服务器SQL模式 - NO_ZERO_DATE。
来自参考:NO_ZERO_DATE
- 在严格模式下,不要将'0000-00-00'
作为有效日期。您仍然可以使用 IGNORE 选项插入零日期。如果不是严格模式,则接受日期,但会生成警告。
答案 1 :(得分:112)
如果您从MySQL工作台生成脚本。
生成以下行
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
从SQL_MODE中删除TRADITIONAL,然后脚本应该可以正常工作
否则,您可以将SQL_MODE设置为允许无效日期
SET SQL_MODE='ALLOW_INVALID_DATES';
答案 2 :(得分:40)
TIMESTAMP的范围为'1970-01-01 00:00:01'UTC到'2038-01-19 03:14:07'UTC(见doc)。默认值必须在该范围内。
其他奇怪的,相关的行为:
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)
旁注,如果你想插入NULLS:
CREATE TABLE tbl4 (
ts TIMESTAMP NULL DEFAULT NULL);
答案 3 :(得分:32)
在ubuntu桌面16.04中,我这样做了:
在您选择的编辑器中打开文件:/etc/mysql/mysql.conf.d/mysqld.cnf
。
查找:sql_mode
,它位于[mysqld]
下方。
并将sql_mode
设置为以下内容:
NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
通过执行以下操作保存并重新启动mysql服务:
sudo service mysql restart
答案 4 :(得分:8)
使用 OS X ,根据其编译的默认值从 Homebrew ,系统变量安装mysql。 解决方法是从系统变量“sql_mode”中删除“NO_ZERO_DATE”。
请记住,范围涉及。
如果您只想在会话中受到影响,请使用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"
在这种情况下,一旦您的会话结束或您的更改,它将不会受到影响。它对其他会话没有影响。
如果您想影响所有客户,请使用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".
,例如:
plt.plot(gaussian(x, 1, 0))
在这种情况下,它只会影响更改后连接的客户端(不会影响当前的所有客户端),并且一旦服务器退出就无法工作。
答案 5 :(得分:8)
我能够通过从Homebrew
安装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
答案 6 :(得分:5)
要避免此问题,您需要从mysql模式配置中删除NO_ZERO_DATE
。
NO_ZERO_DATE
(及其尾随逗号)。在使用wamp或xamp的本地环境中,这是一个非常常见的问题。
答案 7 :(得分:4)
我在MySQL 5.7中遇到了类似的问题,代码如下:
`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
我通过使用它来修复:
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
答案 8 :(得分:1)
禁用严格的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
答案 9 :(得分:1)
更改此:
`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 ,
答案 10 :(得分:1)
Just Define following lines at top of your Database SQL file.
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
It is working for me.
答案 11 :(得分:1)
您可能希望检查MySql实例上的时区设置:
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | SYSTEM |
+---------------+--------+
在我的情况下,我意识到底层系统的时区设置为BST而不是UTC,因此在创建表中,默认的“1970-01-01 00:00:01”被强制退回1小时,导致时间戳值无效。
对我来说,我实际上希望机器的时区设置为UTC,这样就把我排除了。当我运行Centos / 7时,我只是做了
# timedatectl set-timezone UTC
并重新启动所有内容。
答案 12 :(得分:0)
默认值应从1000年开始。
例如,
ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'
希望这有助于某人。
答案 13 :(得分:0)
你可以改变这个:
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
对于这样的事情:
`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
答案 14 :(得分:0)
您可以更改此设置:
create_date
日期时间NOT NULL缺省'0000-00-00 00:00:00',
对于这样的事情:
create_date
varchar(80)不是NULL默认值'0000-00-00 00:00:00',
答案 15 :(得分:0)
我尝试将列的类型设置为'timestamp',它对我有用。
答案 16 :(得分:0)
如果你没有服务器的管理权限,你可以只设置当前会话的sql模式:
SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';