我有一个名为"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:抱歉我的英语不好!
答案 0 :(得分:1)
是的,您的问题似乎是标签中的数据属于多个表。
如果我没弄错,那么 FK 会告诉数据库在参考表中检查 FK 表中的每个值。
此处,您有来自a
和b
以及c
和d
的标签。当数据库验证 FK 时,它将无法在标签中找到与b,c,d,etc
中的数据相对应的数据。它只能找到a
中的那些。
这就是为什么在尝试创建表时以及尝试将数据重新加载到表时出现错误的原因。 FK列中的所有记录必须在引用的表中具有匹配项。 (这里是label -> FK -> a
)