我有下面的sql创建语句
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):'create_date'的默认值无效
这里的误差是多少?
我在OS X上通过从Homebrew安装MySQL解决了这个问题
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,因此在创建表中,默认的'1970-01-01 00:00:01'被强制回1小时,导致无效的时间戳值。
对我来说,我实际上希望机器的时区设置为UTC,这让我解决了问题。当我运行Centos/7时,我只是这么做了
# timedatectl set-timezone UTC
然后重启一切。
时间戳的范围是'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)
旁注,如果你想插入null:
CREATE TABLE tbl4 (
ts TIMESTAMP NULL DEFAULT NULL);