2016-07-15 93 views
2

我搜索得很好,找不到解决问题的答案。这是我的问题的一个简单例子。假设我有一个表test,其中有两个字段firstsecond。我做first的主键,并要second参考first和级联更新。这将允许我创建一个行列表,知道哪个行在任何给定行之后,除非是'head'。外键参考相同表

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

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

这是成功的。然后我尝试更新第1行,得到的值为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 

回答

0

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

  • 主键不能为空
  • 和您的引用列已经允许空值,(不允许引用时列不null)

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

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

+0

主键不是空的,因为它将是第一行的c和第二行的b。而且,引用列也不会有空值。第一行是b,第二行是c。 –

+1

它不会有空值,但?请你可以粘贴'show create table test'来查看结构。谢谢 –

+0

当然,编辑我的问题与结果。 –