MySQL插入数据报错Cannot Add or Update Child Row的成因及修复方案问询
报错成因
- 外键约束的插入顺序违背:ORDERS表定义了外键
CUSTOMER_NUM关联父表CUSTOMERS的同名字段,外键约束要求子表插入的关联字段值,必须在父表中已存在。你当前先执行ORDERS表的插入,用到的客户编号126、334、386等在CUSTOMERS表中没有对应记录,直接触发外键校验失败报错。 - 表缺失问题:你提供的建表代码中没有ITEMS表的创建语句,但ORDER_LINES表定义了外键关联ITEMS表的
ITEM_NUM字段,后续插入ORDER_LINES数据时也会触发同类报错。 - 字段定义隐患:你将金额、比例类字段定义为
dec(15,15),该格式表示整数位为0,最大值仅能存储0.999999...,无法正常存储余额、信用额度等大于1的数值,会导致数据截断报错。
修复方案
- 按照「无依赖父表→关联子表」的顺序调整插入逻辑,是生产环境的标准修复方案:
- 第一步先执行REPS表的插入,REPS表无外键依赖可直接插入成功
- 第二步插入CUSTOMERS表数据,确保ORDERS中用到的126、334等客户编号全部提前录入,且CUSTOMERS关联的
REP_NUM是REPS表已存在的值 - 第三步再执行ORDERS表的插入,此时外键校验可正常通过
- 第四步先补建ITEMS表(主键为
ITEM_NUM varchar(4))并录入商品数据后,再插入ORDER_LINES表数据
- 测试环境临时导入数据可选择临时关闭外键校验,插入完成后重新开启即可:
-- 临时关闭外键约束校验 SET FOREIGN_KEY_CHECKS = 0; -- 执行你的插入语句 insert into ORDERS VALUES ('51608','2015-10-12','126'), ('51610','2015-10-12','334'), ('51613','2015-10-13','386'), ('51614','2015-10-13','260'), ('51617','2015-10-15','586'), ('51619','2015-10-15','126'), ('51623','2015-10-15','586'); Insert into REPS VALUES ('15','Campos','Rafael','724 Vinca Dr','Grove','CA','90092','0.06'), ('30','Gradey','Megan','632 Liatris St','Fullton','CA','90085','0.08'), ('45','Tian','Hui','1785 Tyler Ave','Northfield','CA','90098','0.06'), ('60','Sefton','Janet','267 Oakley St','Congaree','CA','90097','0.06'); -- 插入完成后重新开启外键校验,保证后续数据一致性 SET FOREIGN_KEY_CHECKS = 1;
注意:该方案仅适用于测试环境,生产环境禁止使用,会破坏数据关联一致性。
- 修复不合理的字段定义,避免后续数据截断问题:
ALTER TABLE CUSTOMERS MODIFY COLUMN BALANCE DEC(15,2), MODIFY COLUMN CREDIT_LIMIT DEC(15,2); ALTER TABLE REPS MODIFY COLUMN COMM_RATE DEC(5,2);
内容的提问来源于stack exchange,提问作者Teknomancer
相关产品推荐
相关产品推荐

