3

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

_LABEL_ID (varchar)
_LENGTH   (varchar)

这个表已经有数据了!

我还有其他几张桌子"a", "b", "c",等。

这些表具有列_LABEL_ID(varchar)。这些表不为空

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

不能在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:对不起我的英语不好!

4

1 回答 1

1

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

如果我没记错的话,FK会告诉数据库检查FK表中每个值的引用表。

a在这里,您有来自andbcand的标签d。当 DB 去验证FK时,它不会在label中找到与 中的数据相对应的数据b,c,d,etc。它只会找到a.

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

于 2013-09-29T19:05:46.680 回答