报错说明目标字段为not null但导入数据含null或空字符串;navicat 12默认将空单元格映射为null,需在字段映射中改为“插入空字符串”或设default值,不可绕过校验。
navicat 12 导入数据时遇到 “error: 在字段 ‘xxx’ 中空值违反了非空约束”,说明目标表该字段定义为 not null,但导入的数据里有 null 或被误识别为空字符串('')——这不是 navicat 的 bug,而是它严格按 sql 标准解析导致的语义冲突。
为什么空字符串会被当成 NULL?
Navicat(尤其 12 版本)在解析 CSV/Excel/SQL 文件时,对空单元格或纯空白字段默认映射为 SQL NULL。如果目标字段是 NOT NULL 且没有默认值,就会直接报错。更隐蔽的是:源库中某些字段设计为“允许空字符串但禁止 NULL”,而导出的 SQL 里用 '' 表示空值,但 Navicat 在某些编码或格式下会把 '' 和 NULL 混淆处理(尤其当文件保存为 ANSI 编码、或含 BOM 头时)。
- 检查原始 Excel/CSV:用文本编辑器打开,确认空单元格是否真的为空,还是含不可见字符(如
\t、) - 确认导出 SQL 是否用了
NULL字面量插入空字段(应改为'') - Navicat 导入向导中「字段映射」页,点开每个字段看「空值处理」下拉框——默认可能是「插入 NULL」,需手动改成「插入空字符串」或「使用默认值」
导入前临时绕过非空检查可行吗?
不行。SET sql_mode = '' 或 SET FOREIGN_KEY_CHECKS = 0 对 NOT NULL 约束完全无效——这是 DML 层的强制校验,MySQL 在 INSERT 阶段就拦截,不依赖 SQL 模式或外键开关。
- 想跳过校验,唯一办法是先删掉
NOT NULL约束:ALTER TABLE t MODIFY COLUMN c VARCHAR(50);(去掉NOT NULL) - 但导入后再加回去:
ALTER TABLE t MODIFY COLUMN c VARCHAR(50) NOT NULL;,此时会失败——因为已有NULL数据存在 - 所以必须同步清理:导入后执行
UPDATE t SET c = '' WHERE c IS NULL;,再加约束
最稳妥的实操路径(推荐)
别依赖“跳过错误记录”选项——它只对解析失败生效(如日期格式错),对 NOT NULL 违反直接中断整个事务,不会跳过单行。
- 用 Navicat「数据传输」功能替代「运行 SQL 文件」:它走的是二进制协议直传,不经过 SQL 解析层,能正确区分
NULL和'',且自动处理空值映射 - 若必须用 SQL 文件:用文本编辑器全局替换所有
NULL(出现在 VALUES 后的)为'',并确保文件编码为 UTF-8 无 BOM - 提前在目标库建表时,给所有业务上允许空的
NOT NULL字段加上默认值:DEFAULT '',这样即使数据缺值,也能兜底
真正麻烦的不是报错本身,而是你得判断:这个 NULL 是脏数据(该补值)、设计缺陷(不该设 NOT NULL),还是工具链语义失真(源库和 Navicat 对空的理解不一致)。三者对应三种解法,混用只会让问题更难追溯。











