外键引用相同表

时间:2016-07-15 07:34:16

标签: mysql sql foreign-keys key

我搜索得很好,找不到能很好地解释问题的答案。这是我的问题的简化示例。假设我有一个表test,其中包含两个字段firstsecond。我将first作为主键,并希望second引用first并在更新时级联。这将允许我创建一个行列表,知道哪一行在任何给定行之后,除非'head'。

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

  1. first: a second: b
  2. first: b second: a
  3. 这是成功的。然后,我尝试更新第1行,使first值为c。但是,这没有用,说外键失败了。为什么?它不应该只是变成以下?

    1. first: c second: b
    2. first: b second: c
    3. 我唯一的预感是存在循环更新,第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
      

1 个答案:

答案 0 :(得分:0)

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

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

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

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