问题:
远程连接linux上的mysql后,创建表时报表:[Err] 1067 - Invalid default value for 'runtime'
sql语句内容:
CREATE TABLE `t_report` (
`runtime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
`sucess` int(11) DEFAULT NULL,
`fail` int(11) DEFAULT NULL,
`skip` int(11) DEFAULT NULL,
PRIMARY KEY (`runtime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
出错原因:
liunx上的mysql版本为5.7引起的默认值不兼容的问题。上述使用了时间字段,类型是datetime。想到可能是类型的默认值被限制了,查看 sql_mode

出问题的值是:
NO_ZERO_IN_DATE:
在严格模式下,不允许日期和月份为零
NO_ZERO_DATE:
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
ONLY_FULL_GROUP_BY
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
解决方案:直接修改my.cnf文件
vi /etc/my.cnf
在[mysqld]下面添加如下列:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

重启mysql:执行命令service mysqld restart
如果sql_mode设置了ONLY_FULL_GROUP_BY,那么每一个sql语句中都要加上 group by 字段,否则就是不合法。
解决该问题,可直接去掉ONLY_FULL_GROUP_BY即可。
网友评论