简述

在环境一正常的数据想拷贝到环境二,结果导入数据库的时候出现了“ERROR:在字段“xx”中空值违反了非空约束”错误。

原因分析

经过分析,这个错误出现的原因是sql文件中 代表空值的 Null 和代表空字符串的 '' 都被识别为了Null。由于前期设计数据时,部分字段同时设置了不能为空且默认值为空字符串,所以出现了大量被错误识别的空字符串数据。

解决方案

1. 不要出现空字符串

没有空字符串就不会出现混淆,当然这是前期设计的问题,看到这里相信已经没办法去修改空字符串的问题了,所以我们需要别的解决方案。

2. 使用数据库同步工具

如果你使用的数据库管理工具具有数据库同步工具,并且两个环境的网络互通,那么这件事就很好解决了。否则还是直接跳到方法3吧。

以Navicat距离,点击 工具-数据传输 或者数据同步,然后选择两个环境的数据库,根据提示完成数据传输即可,这个工具不会出现简述中将空串识别为Null的问题。

3. 先取消约束

① 在导出的sql中全局替换`NOT NULL`为空,这样导入数据库时创建的表字段就没有非空约束限制了。虽然数据成功导入了,但是毕竟出现了数据失真的情况,所以还需要后续处理。

② 将所有原非空字段中的NULL替换为空字符串,以table表的id字段为例

UPDATE "table"  
SET id = ''  
WHERE id IS NULL;

至于哪些字段是原非空字段,这个就需要自己整理了。

③ 为非空字段添加非空约束,把之前暂时取消的非空约束重新加上。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐