alter table和foreign key出错

时间:2015-07-30 12:10:17

标签: mysql database foreign-keys

我有两张桌子:

  • 安装人员(字段:id,公司,国家,经验,姓名)
  • 联系人(字段:姓名,电话,地址)

我想匹配这两个名称,因此我可以单击一个安装人员名称的值,它可以显示联系人表的值。

然而,当我尝试设置外键时(我的子表可能是安装程序,因为我有更多这样的表,而联系人将是父项。)它说明了这个错误:

查询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)REFERENCES Contactsname)ON DELETE CASCADE   ON UPDATE CASCADE)

两个表都是InnoDB,并且Contacts.name被索引以及Installers.name

安装程序的主键是id,Contac的主键是名称。

知道会出现什么问题?

1 个答案:

答案 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;