已在父表添加对应记录仍触发Cannot add or update a child row: a foreign key constraint fails错误的技术问询
你遇到的这个外键约束错误,主要有两个核心原因,咱们一步步拆解:
1. 父表的插入语句本身就执行失败了
看你的父表定义,比如custinfo_tb里的email、contact、address、tdcp、pc都是NOT NULL约束,但你插入时只提供了transactionID和Col_ID,其他必填字段都没赋值。MySQL会直接拒绝这类不满足约束的插入操作,这就导致你的父表根本没有你以为存在的那条记录,子表自然找不到匹配的外键。
其他父表比如brokerinfo_tb(缺少Broker_contact、Account_wBroker)、stockinfo_tb(缺少Stock_Name、Stock_Amount、Avecost、Cert_amount)、transactiontype_tb(缺少transferdesc、transperiod、transfee)也存在同样的问题——插入语句没给全NOT NULL字段的值,所以这些父表的插入都没成功。
2. 子表插入的COL_ID值和父表不匹配
就算父表插入成功了,你插入transaction_tb时用的COL_ID是201808111,但你往custinfo_tb插入的Col_ID是20180111,这两个值完全不匹配。而你的外键是联合外键(Col_ID, transactionID),需要这两个值同时和父表的主键匹配才会生效,所以即使transactionID都是1,Col_ID不匹配也会触发外键约束错误。
另外还有个小细节:transaction_tb的transactionID设置了AUTO_INCREMENT,虽然手动指定值是允许的,但如果之后要依赖自动生成ID,建议让数据库自动分配,避免后续出现ID冲突。
修正后的示例代码
先修正父表的插入语句,补全所有NOT NULL字段的值,再修正子表的COL_ID值使其与父表匹配:
-- 修正父表插入,补全所有NOT NULL字段的必填值 INSERT INTO brokerinfo_tb (transactionID, Brokerid, Broker_contact, Account_wBroker) VALUES (1, '1', 123456789, 'ACC_001'); INSERT INTO custinfo_tb (transactionID, Col_ID, email, contact, address, tdcp, pc) VALUES (1, 20180111, 'test@example.com', 987654321, '123 Main St', 'TDCP_001', '1234'); INSERT INTO stockinfo_tb (transactionID, Stock_Code, Stock_Name, Stock_Amount, Avecost, Cert_amount) VALUES (1, 'AR', 'Apple Inc', 100, 150.5, 15050.0); INSERT INTO transactiontype_tb (transactionID, Transfertype, transferdesc, transperiod, transfee) VALUES (1, 'TRANSFER_IN', 'Incoming Transfer', '2024-05', '10.00'); -- 修正子表的COL_ID,与父表custinfo_tb的Col_ID保持一致 INSERT INTO transaction_tb (transactionID, Brokerid, COL_ID, Stock_Code, Transfertype, sysdate) VALUES (1, '1', 20180111, 'AR', 'TRANSFER_IN', CURDATE());
这样执行的话,外键约束就能正常通过了。
内容的提问来源于stack exchange,提问作者Asher Manangan

