【问题标题】:Foreign Key Referencing Same Table外键引用同一张表
【发布时间】:2016-11-18 07:50:22
【问题描述】:

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

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

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

这很成功。然后我尝试更新第 1 行以使 first 值为 c。但是,这不起作用,说明外键失败。为什么?不应该变成下面这样吗?

  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

【问题讨论】:

    标签: mysql sql foreign-keys key


    【解决方案1】:

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

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

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

    更新:问题是外键和引用键在同一个表中,我用不同的表进行了测试,它工作正常。

    【讨论】:

    • 主键不为空,因为第一行是 c,第二行是 b。此外,引用列也不会有空值。第一行是 b,第二行是 c。
    • 它不会有空值但是?请您粘贴show create table test 以查看结构。谢谢
    • 谢谢,我尝试了不同的解决方案,但没有成功,问题是它在同一个表中引用,不同的表可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多