为什么不能在mysql中添加外键

时间:2013-09-29 18:13:16

标签: mysql

我有一个名为"label"的表,有两列:

_LABEL_ID (varchar)
_LENGTH   (varchar)

此表已包含数据!

我还有其他几个表"a", "b", "c",等。

这些表有_LABEL_ID列(varchar)。这些表不是空的

删除表a, b, c, ...等中的任何行,然后从“label”表中删除其标签。我尝试将外键添加到引用到表label的“"a"”以执行此操作(仅用于测试),但是在此问题中得到了相同的错误:

can't add foreign key in mysql?

在我的情况下,我有InnoDB引擎用于所有表,唯一名称FK,相同的数据类型。

现在我导出了label行,然后清空了label表,向"a"表引用了外键,就可以了。如果我再次将行导入label表,我会得到与尝试添加外键时相同的错误。

label表中的行属于不同的表(a,b,c,.. etc)。这是错误的原因吗?

我使用MySQL Workbench

执行此操作

编辑:真正的SQL语句和错误消息:

ALTER TABLE `cal_view_db`.`dbo_pub_label` 
  ADD CONSTRAINT `fk_dbo_pub_label_treenode`
  FOREIGN KEY (`_LABEL_ID` )
  REFERENCES `cal_view_db`.`dbo_system_treenode` (`_NAME_ID` )
  ON DELETE CASCADE
  ON UPDATE NO ACTION
, ADD INDEX `fk_dbo_pub_label_treenode_idx` (`_LABEL_ID` ASC) ;

错误讯息:

ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (`cal_view_db`.`#sql-10cc_4a`, CONSTRAINT `fk_dbo_pub_label_treenode` FOREIGN KEY (`_LABEL_ID`) REFERENCES `dbo_system_treenode` (`_NAME_ID`) ON DELETE CASCADE ON UPDATE NO ACTION)
SQL Statement:
ALTER TABLE `cal_view_db`.`dbo_pub_label` 
  ADD CONSTRAINT `fk_dbo_pub_label_treenode`
  FOREIGN KEY (`_LABEL_ID` )
  REFERENCES `cal_view_db`.`dbo_system_treenode` (`_NAME_ID` )
  ON DELETE CASCADE
  ON UPDATE NO ACTION
, ADD INDEX `fk_dbo_pub_label_treenode_idx` (`_LABEL_ID` ASC)

ERROR: Error when running failback script. Details follow.

ERROR 1046: No database selected
SQL Statement:
CREATE TABLE `dbo_pub_label` (
  `_LABEL_ID` varchar(45) NOT NULL,
  `_LENGTH` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`_LABEL_ID`),
  KEY `fk_dbo_pub_label_1_idx` (`_LABEL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
非常感谢

p.s:抱歉我的英语不好!

1 个答案:

答案 0 :(得分:1)

是的,您的问题似乎是标签中的数据属于多个表。

如果我没弄错,那么 FK 会告诉数据库在参考表中检查 FK 表中的每个值。

此处,您有来自ab以及cd的标签。当数据库验证 FK 时,它将无法在标签中找到与b,c,d,etc中的数据相对应的数据。它只能找到a中的那些。

这就是为什么在尝试创建表时以及尝试将数据重新加载到表时出现错误的原因。 FK列中的所有记录必须在引用的表中具有匹配项。 (这里是label -> FK -> a