繁体   English   中英

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

[英]why cannot add foreign key in mysql

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

_LABEL_ID (varchar)
_LENGTH   (varchar)

这个表已有数据了!

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

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

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

不能在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

非常感谢

ps:抱歉我的英语不好!

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

如果我没有弄错,那么FK告诉DB在FK表中检查引用表中的每个值。

在这里,您有ab以及cd标签。 当DB去验证FK时 ,它将不会在标签中找到与b,c,d,etc的数据相对应的数据。 它只会发现在的那些a

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM