我搜索得很好,但找不到能很好地解释问题的答案。这是我的问题的一个简化示例。假设我有一个表 test
,其中包含两个字段 first
和 second
。我将 first
设为主键,并希望 second
引用 first
并在更新时级联。这将允许我制作一个行列表,知道哪一行在任何给定行之后,除非“头”。
创建表工作正常,但是当我尝试添加一行时,它提示带有级联更新的外键约束失败。这是有道理的,因为我将 second
保留为 null。因此,我想我可以插入两行,然后添加外键:
第一:a 第二:b
第一:b 第二:a
这是成功的。然后,我尝试更新第 1 行,使 first
值为 c
。但是,这没有用,说明外键失败。为什么?不应该变成下面这样吗?
第一:c 第二:b
第一:b 第二:c
我唯一的预感是存在循环更新,第 1 行的更新级联到第 2 行,级联回第 1 行,但这不应该发生!没有任何内容引用 second
,因此更新应该只是级联到第 2 行并停止。请帮忙,这让我发疯。
编辑:根据要求,这是我的show create table test
。
CREATE TABLE `test` (
`first` varchar(32) NOT NULL,
`second` varchar(32) NOT NULL,
PRIMARY KEY (`first`),
KEY `fk` (`second`),
CONSTRAINT `fk` FOREIGN KEY (`second`) REFERENCES `test` (`first`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
最佳答案
我认为问题出在列的结构上:
- 主键不能为空
- 并且您的引用列允许空值,(当引用列不为空时不允许)
因此请确保您的两列具有相同的数据类型、相同的字符集,而不是都为 null。
更新:问题是外键和引用键在同一个表中,我已经用不同的表进行了测试并且有效。
关于mysql - 外键引用同一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38390395/