NaviCat导入远程数据库报错[ERR] 1067 - Invalid default value for ‘update_time’

问题描述:

远程数据库向本地库传数据有的表没有传过来
报错[ERR] 1067 - Invalid default value for ‘update_time’

问题详情

1、使用NaviCat将远程库转储为sql文件,之后在本地库中运行该sql文件,报错 Invalid default value for ‘update_time‘

2、通过NaviCat工具下的数据传输功能同样出现上述问题

原因分析:

时间戳导致导入表出错
时间戳报错
表设计如上图所示,而timestamp类型对应日期范围为:1970-01-01 00:00:01 ~ 2037-12-31 23:59:5,因为导入的表字段update_time默认值不在该区间内,所以报错。
且由于在Mysql5.7之后,Mysql使用的是严格模式,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
而在Navicat中使用select @@sql_mode查看远程数据库的sql_mode为空。

1、ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中
2、STRICT_TRANS_TABLES:严格模式,在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制
3、NO_ZERO_IN_DATE:在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。(注:但可以插入“0000-00-00和0000-01-01”
4、NO_ZERO_DATE:在严格模式,不要将 '0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告(注:年月日中任意一个不为零都可插入,全为0报错
5、ERROR_FOR_DIVISION_BY_ZERO:在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
6、NO_AUTO_CREATE_USER:防止GRANT自动创建新用户,除非还指定了密码。
7、NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

解决方案:

在mysql安装根目录新建my.ini文件(windows环境),添加
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES (根据上述分析,其实删掉NO_ZERO_DATE即可)重启mysql服务,之后即可正常导入。
注:导入成功后最好将配置文件在改回去
本文参考自:https://blog.csdn.net/qq_40389276/article/details/100889918

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值