建表语句:
1067 - Invalid default value for 'end_time', Time: 0.000000s
CREATE TABLE `user_info` (
`uid` bigint(10) NOT NULL,
`user_status` tinyint(4) NOT NULL,
`user_type` tinyint(2) NOT NULL,
`user_ctime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`user_mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`uid`),
KEY `status_uid` (`user_status`,`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
分析原因:
-- mysql 日期报错
1067 - Invalid default value for 'end_time', Time: 0.000000s
-- 原因:mysql从5.7开始,默认是严格模式,严格遵从SQL92规范。
mysql> show variables like 'explicit_defaults_for_timestamp';
-- 执行结果:变量explicit_defaults_for_timestamp的value值为off。
mysql> show variables like 'sql_mode';
-- 执行结果
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
解决问题:
-- 更新系统变量
set sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- 检查SQL
show variables like 'sql_mode';
-- 执行建表SQL
-- 执行结果:OK
-- 重启mysql
brew services restart mysql
-- 重启之后 系统变量重新在配置文件里加载会再次恢复
show variables like 'sql_mode';
-- 永久更新 系统变量 方法
-- 1.找到加载的配置文件路径
mysql --help|grep 'my.cnf';
执行结果:/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf
-- 2.修改配置文件路径中的对应项
进入:cd /usr/local/etc/
修改:vi my.cnf
sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
ESC:wq
-- 3.重启MySQL验证修改
brew services restart mysql
mysql -u root -p
show variables like 'sql_mode';
实际SQL