mysql - 外键引用同一张表

标签 mysql sql foreign-keys key

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

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

  1. 第一:a 第二:b
  2. 第一:b 第二:a

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

  1. 第一:c 第二:b
  2. 第一: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/

相关文章:

mysql - 在 MySQL 中启用 InnoDB

java - Hibernate,保存id而不在对象中引用

mysql - 使用 JPQL 或 SQL 确保唯一性(不同记录)?或两者?

mysql - 如何合并mysql存储过程中的行?

mysql - 为什么 MySQL 不在 GROUP BY 查询中使用这个索引?

javascript - Node.JS Express 静态目录

MySQL 查询 40,000 行 v/s 一次加载和 for 循环

php - 获取要在表单中显示的数据

java - Hibernate 运行时出现 "Table not found"错误

sql - PostgreSQL - 选择条件满足的不同(列1,列2)