Navicat 12 导入数据时外键约束报错,不能仅靠 SET FOREIGN_KEY_CHECKS = 0 解决,因其在混合SQL文件中易被注释覆盖、自动提交导致会话失效、不适用于DDL建表阶段,且需满足InnoDB引擎、字段类型/字符集一致、子表外键有索引等硬性条件。
navicat 12 导入数据时遇到外键约束报错,**不能直接执行 set foreign_key_checks = 0 就完事**——这个语句在 navicat 12 的默认行为下大概率被覆盖或失效,尤其当你导入的是含建表语句的混合 sql 文件。
Navicat 12 默认导出/生成的 SQL 脚本里,经常自带条件注释如 /*!40014 SET FOREIGN_KEY_CHECKS = 1 */,它会在脚本执行中途强行恢复校验;更关键的是,Navicat 12 的「运行 SQL 文件」功能默认按自动提交(autocommit)模式执行,而 SET FOREIGN_KEY_CHECKS = 0 只对当前会话有效,若脚本分多批次执行,中间连接重置就会失效。
SET FOREIGN_KEY_CHECKS = 0 只影响第一条语句,后续 INSERT 不一定继承SET FOREIGN_KEY_CHECKS = 1,直接覆盖你的设置确认你只是往已有表里插记录,不是建表也不是改结构。此时才适合临时绕过校验:
SET FOREIGN_KEY_CHECKS = 0;,按回车确保执行成功(状态栏显示“受影响行数:0”即为 OK)SET 失效)SET FOREIGN_KEY_CHECKS = 1;,避免后续操作意外破坏完整性SET 生效范围Navicat 12 对混合脚本完全不识别依赖顺序,SET FOREIGN_KEY_CHECKS = 0 对 CREATE TABLE ... FOREIGN KEY 这类 DDL 无效,MySQL 在建表阶段仍会校验父表是否存在。
CREATE TABLE,把无外键或只被引用(如 users、categories)的表定义移到最前面SET FOREIGN_KEY_CHECKS = 1,保留开头一个 SET FOREIGN_KEY_CHECKS = 0 即可--skip-foreign-key-checks 重新导出(但注意:这会导致外键定义丢失,仅限你确认不需要重建约束)即使关了检查,Navicat 12 导入仍可能失败,因为 MySQL 服务端在执行阶段还会做几项不可绕过的校验:
InnoDB——MyISAM 表加外键语法通过,但实际不生效COLUMN_TYPE 必须严格一致,比如 INT(11) UNSIGNED 和 INT(11) 就不匹配utf8mb4_unicode_ci 和 utf8mb4_general_ci 可以,但 utf8mb3 和 utf8mb4 会触发报错