外键引用同一个表

Mat*_*ich 5 mysql sql key foreign-keys

我搜索得很好,但找不到可以很好地解释问题的答案。这是我的问题的一个简化示例。假设我有一个test包含两个字段firstsecond. 我制作first了主键并希望在更新时second引用first和级联。这将允许我制作一个行列表,知道哪一行出现在任何给定行之后,除非“头”。

创建表工作正常,但是当我尝试添加一行时,它抱怨带有级联更新的外键约束失败。这是有道理的,因为我保留second为空。因此,我想我可以插入两行,然后添加外键:

  1. first: a second: b
  2. first: b second: a

这是成功的。然后我尝试将第 1 行更新firstc. 但是,这不起作用,说明外键失败。为什么?不应该变成下面这样吗?

  1. first: c second: b
  2. first: b second: 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
Run Code Online (Sandbox Code Playgroud)

Geo*_*ili 1

我认为问题出在列的结构上:

  • 主键不能为空
  • 并且您的引用列允许空值(当引用列不为空时不允许)

因此,请确保两列具有相同的数据类型、相同的字符集,且两者都不为空。

更新:问题是外键和引用键位于同一个表中,我已经使用不同的表进行了测试并且它有效。