我有以下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` 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;
Run Code Online (Sandbox Code Playgroud)
给出以下错误
ERROR 1067 (42000): Invalid default value for 'create_date'
这里有什么错误?
Dev*_*art 164
那是因为服务器SQL模式 - NO_ZERO_DATE.
从参考文献:NO_ZERO_DATE- 在严格模式下,不允许'0000-00-00'作为有效日期.您仍然可以使用IGNORE选项插入零日期.如果不是严格模式,则接受日期,但会生成警告.
小智 128
如果您从MySQL工作台生成脚本.
生成以下行
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
Run Code Online (Sandbox Code Playgroud)
从SQL_MODE中删除TRADITIONAL,然后脚本应该正常工作
否则,您可以将SQL_MODE设置为允许无效日期
SET SQL_MODE='ALLOW_INVALID_DATES';
Run Code Online (Sandbox Code Playgroud)
小智 45
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)
Run Code Online (Sandbox Code Playgroud)
旁注,如果要插入NULLS:
CREATE TABLE tbl4 (
ts TIMESTAMP NULL DEFAULT NULL);
Run Code Online (Sandbox Code Playgroud)
Mub*_*bas 35
在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
Ash*_*ich 14
只需在数据库 SQL 文件的顶部定义以下几行即可。
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
Run Code Online (Sandbox Code Playgroud)
它对我有用。
小智 8
使用OS X,根据其编译的默认值从Homebrew,System Variables 安装mysql .解决方案是从系统变量"sql_mode"中删除"NO_ZERO_DATE".
请记住,范围涉及到.
如果您只想在会话中受到影响,请使用"@@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".
Run Code Online (Sandbox Code Playgroud)
在这种情况下,一旦您的会话结束或您的更改,它将不会影响.它对其他会话没有影响.
如果您想影响所有客户,请使用"@@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".
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它只会影响更改后连接的客户端(不影响当前所有客户端),并且一旦服务器退出就无法工作.
通过从Homebrew安装MySQL,我能够在OS X上解决这个问题
brew install mysql
Run Code Online (Sandbox Code Playgroud)
将以下内容添加到/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
Run Code Online (Sandbox Code Playgroud)
并重新启动MySQL
brew tap homebrew/services
brew services restart mysql
Run Code Online (Sandbox Code Playgroud)
我在MySQL 5.7中使用以下代码遇到了类似的问题:
`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
我通过使用此解决:
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
要避免此问题,您需要NO_ZERO_DATE从mysql模式配置中删除.
NO_ZERO_DATE从配置中删除(及其尾随逗号).这是在wamp或xamp的本地环境中非常常见的问题.