1. 程式人生 > >mysql外來鍵建立失敗的問題

mysql外來鍵建立失敗的問題

開發中使用django框架, 連線mysql資料庫, 建了些model, 使用python manage.py migrate時報錯如下:

django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')

首先使用SHOW ENGINE INNODB STATUS\G;  找到LATEST FOREIGN KEY ERROR項檢視, 顯示如下:

Error in foreign key constraint of table drmk_work/#sql-285c_158a:
 FOREIGN KEY (`hospital_id`) REFERENCES `hospital_hospital` (`objectId`):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

然後檢視被關聯的表,發現被關聯的鍵是primary key。沒有問題。

網上找到mysql建立外來鍵失敗的原因有以下多種:

1.兩個欄位的型別或者大小不嚴格匹配,例如,如果一個是INT(10), 那麼外來鍵也必須設定成INT(10), 而不是 INT(11) 也不能是TINYINT. 你得使用SHOW命令來檢視欄位的大小,因為一些查詢瀏覽器有時候把int(10) 和int(11) 都顯示為integer。另外,你還必須確定兩個欄位是否一個為SIGNED,而另一個又是UNSIGNED, 這兩欄位必須嚴格地一致匹配,更多關於signed 和unsigned的資訊,請參閱:http://www.verysimple.com/blog/?p=57 。

2.你試圖引用的其中一個外來鍵沒有建立起索引,或者不是一個primary key , 如果其中一個不是primary key 的,你必須為它建立一個索引。 

3.外來鍵的名字是一個已經存在的一個鍵值了,這個時候,你應該檢查你的資料庫以確保外健名字是唯一的,或者你在鍵名後面加上幾個隨機的字元以測試是否是這個原因。 

4.其中一個或者兩個表是MyISAM引擎的表,若想要使用外來鍵約束,必須是InnoDB引擎,(實際上,如果兩個表都是MyISAM 引擎的,這個錯誤根本不會發生,但也不會產生外來鍵),你可以通過查詢瀏覽器來設定表的引擎型別。

5.你可能設定了ON DELETE SET NULL, 但是相關的鍵的欄位又設定成了NOTS NULL 值。你可能通過修改cascade 的屬性值或者把欄位屬性設定成allow null來搞定這個bug. 

6.請確定你的Charset 和 Collate 選項在表級和欄位級上的一致。

7.你可能設定為外來鍵設定了一個預設值,如default=0。

8.在這個關係裡面,其中的一個欄位是一個混合鍵值中的一個,它沒有自己獨立的索引,這時,你必須為它建立一個獨立的索引。 

9.ALTER 宣告中有語法錯誤。


根據第6條提示發現兩個表的Charset不一樣,一個是utf8,一個是latin-1  修改後成功。