导入含'0000-00-00 00:00:00'的DATETIME数据报错1525求解决
解决MySQL导入零值日期报错(Error Code: 1525)的问题
问题根源
你的SQL语句报错,是因为MySQL 5.7+默认开启了STRICT_TRANS_TABLES和NO_ZERO_DATE模式。当查询旧表的date_column时,MySQL会先解析这个字段为DATETIME类型,而'0000-00-00 00:00:00'属于无效日期,直接触发校验错误——哪怕你后续要替换它,查询阶段已经报错了。
解决方案
方法一:临时修改会话SQL模式(适合一次性数据迁移)
在执行INSERT语句前,先临时关闭会话级别的严格校验和零日期限制,这样MySQL允许读取旧表的零值日期:
-- 保存原SQL模式(可选,执行完后可恢复) SET @original_sql_mode = @@sql_mode; -- 修改会话SQL模式,允许读取零日期 SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', ''); SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', ''); -- 执行你的插入语句 INSERT INTO new_table ( column_a, date_column ) SELECT column_a, IF( STRCMP(`date_column`,'0000-00-00 00:00:00')=0, CURRENT_TIMESTAMP(), `date_column` ) FROM old_table; -- 恢复原SQL模式(可选) SET SESSION sql_mode = @original_sql_mode;
方法二:修改SQL语句,避免直接解析无效日期
把日期字段转换为字符串后再比较,绕开MySQL的日期校验:
INSERT INTO new_table ( column_a, date_column ) SELECT column_a, CASE WHEN CAST(`date_column` AS CHAR) = '0000-00-00 00:00:00' THEN CURRENT_TIMESTAMP() ELSE `date_column` END AS date_column FROM old_table;
或者用二进制比较(性能略优,适合大数据量):
INSERT INTO new_table ( column_a, date_column ) SELECT column_a, IF( HEX(`date_column`) = '00000000000000', CURRENT_TIMESTAMP(), `date_column` ) FROM old_table;
内容的提问来源于stack exchange,提问作者yossi
相关产品推荐
相关产品推荐

