2016-07-15 91 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

當然,編輯我的問題與結果。 –