向带有外键约束的SQL表插入数据报错问题咨询
带外键约束的ItemBook表插入操作解决方案
两次插入失败的原因
第一次报错
- 字段名不匹配:ItemBook表的外键字段为
ItemName,你写的Name是父表Item的字段,列名写错会触发语法错误 - 1175错误是MySQL安全更新模式的默认限制,你可以选择临时关闭会话级别的安全模式,不需要修改全局配置
第二次报错
- 表名完全写错:你用到的
eventbook、event都不是你创建的表,你的目标表是ItemBook,关联父表是Item - 字段数量不匹配:INSERT要求插入2个字段,但是SELECT子句只返回了1个字段
- 逻辑错误:WHERE条件里引用了还未完成插入的
eventbook.EventName,该字段在查询上下文中不存在
正确插入方式
你已经提前在Item表插入了Name='Clippers'的记录,满足外键约束要求,直接使用下面的语句即可:
INSERT INTO ItemBook (ItemName, Publisher) VALUES ('Clippers', 'Bob');
如果执行后还是报1175安全模式错误,在当前会话先执行关闭安全更新的语句即可:
-- 临时关闭当前会话的安全更新模式 SET SQL_SAFE_UPDATES = 0; -- 执行插入操作 INSERT INTO ItemBook (ItemName, Publisher) VALUES ('Clippers', 'Bob'); -- 可选:操作完成后重新开启安全更新模式 SET SQL_SAFE_UPDATES = 1;
如果需要插入时自动校验Item表是否存在对应记录,可以用SELECT结合INSERT的写法:
INSERT INTO ItemBook (ItemName, Publisher) SELECT Name, 'Bob' FROM Item WHERE Name = 'Clippers';
这个写法会自动跳过Item表不存在对应记录的插入操作,完全符合外键约束的校验要求。
内容的提问来源于stack exchange,提问作者DreamVision2017
相关产品推荐
相关产品推荐

