我已经搜索了很好,却找不到很好地解释问题的答案。这是我的问题的简化示例。假设我有一个表test,其中有两个字段firstsecond。我将first用作主键,并希望second引用first并在更新时进行级联。这将使我能够列出行,知道哪一行在任何给定行之后,除非有“head”。

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

  • first: a second: b
  • first: b second: a

  • 这是成功的。然后,我尝试更新第1行以使其first值为c。但是,这不起作用,说明外键失败。为什么?它不应该成为下列对象吗?
  • first: c second: b
  • 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
    

    最佳答案

    我认为问题在于列的结构:

  • 主键不能为空
  • ,并且您的引用列已允许使用null值(如果引用列不为null,则不允许使用)

  • 因此,请确保两个列都具有相同的数据类型,相同的字符集,并且不将两者都设为null。

    更新:问题是外键和引用键在同一张表中,我已经用不同的表进行了测试,并且可以正常工作。

    关于mysql - 引用同一表的外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38390395/

    10-13 09:26