我有两张桌子:
我想匹配这两个名称,因此我可以单击一个安装人员名称的值,它可以显示联系人表的值。
然而,当我尝试设置外键时(我的子表可能是安装程序,因为我有更多这样的表,而联系人将是父项。)它说明了这个错误:
查询SQL:
ALTER TABLE `Installers`
ADD FOREIGN KEY (`name`)
REFERENCES `SOLAR_PV`.`Contacts`(`name`)
ON DELETE CASCADE ON UPDATE CASCADE;
MySQL ha dicho:Documentación
1452 - 无法添加或更新子行:外键约束 失败(
SOLAR_PV
。#sql-32a_183
,CONSTRAINT#sql-32a_183_ibfk_1
FOREIGN KEY(name
)REFERENCESContacts
(name
)ON DELETE CASCADE ON UPDATE CASCADE)
两个表都是InnoDB,并且Contacts.name被索引以及Installers.name
安装程序的主键是id,Contac的主键是名称。
知道会出现什么问题?
答案 0 :(得分:2)
您的子表似乎包含了master中没有的几条记录,您可以通过以下查询进行检查 -
SELECT id FROM Installers ins
LEFT JOIN SOLAR_PV.Contacts cnt ON ins.name=cnt.name
WHERE cnt.name IS NULL;
注意:假设name是int类型以获得更好的性能,因为它是一个表中的主键。
如果按上述查询获得的记录很少,那么您可以按照以下2方法进行操作 -
方法1:你可以在子表中删除这些记录,也可以在主表中插入,然后你可以通过这个alter命令创建关系。
方法2:如果您不想更改表中的现有数据并仍想执行您的更改查询,请按以下方式使用 -
SET FOREIGN_KEY_CHECKS=0;
ALTER TABLE `Installers`
ADD FOREIGN KEY (`name`)
REFERENCES `SOLAR_PV`.`Contacts`(`name`)
ON DELETE CASCADE ON UPDATE CASCADE;
SET FOREIGN_KEY_CHECKS=1;