1. 程式人生 > >[Err] 1005 - Can't create table 'xx' (errno: 150) 解決方案

[Err] 1005 - Can't create table 'xx' (errno: 150) 解決方案

轉載別人的部落格:

https://blog.csdn.net/yangzaiqiu1986814/article/details/17009601

具體內容如下:

MySQL錯誤號1005
[錯誤] 1005 - 無法建立表'blog_db。#sql-136c_4'(錯誤號:150)

如果在嘗試建立外來鍵時出現此錯誤,則可能非常令人沮喪。關於無法建立.frm檔案的錯誤似乎是某種作業系統檔案許可權錯誤或其他什麼,但事實並非如此。這個錯誤已被報告為MySQL開發人員列表中的一個錯誤,但它實際上只是一個誤導性的錯誤訊息。

在每種情況下,這都歸因於MySQL不喜歡的關係。不幸的是,它沒有具體說明具體問題。以下是人們為可怕的errno 150報告的原因的執行列表。我試圖根據我聽到的特定原因的頻率將它們整理好。

您可能希望在收到錯誤後立即執行MySQL命令“ SHOW INNODB STATUS ”。此命令顯示日誌資訊和錯誤詳細資訊。(感謝Jonathan提示)

注意:如果您的指令碼在一臺伺服器上執行正常,但在嘗試在另一臺伺服器上執行時出錯,則很可能#6是問題所在。不同版本的MySQL具有不同的預設字符集設定。

已知原因:

兩個關鍵字  段型別  和/或  大小 不完全匹配。例如,如果一個是INT(10),則關鍵欄位也需要是INT(10)而不是INT(11)或TINYINT。您可能希望使用SHOW CREATE TABLE確認欄位大小,因為查詢瀏覽器有時會直觀地顯示INT(1)和INT(11)的INTEGER。你還應該檢查  一個是不是SIGNED而另一個是UNSIGNED(我就是這裡出錯的,被引用表的欄位為unsigned,而引用表中為簽名)。它們都需要完全相同。(關於簽名vs未簽名的更多資訊)。
您嘗試引用的關鍵欄位之一沒有 索引  和/或不是  主鍵。如果關係中的某個欄位不是主鍵,則必須為該欄位建立索引。(感謝Venkatesh和Erichero以及Terminally Incoherent的提示)
外來鍵名稱是 已存在鍵的  副本。檢查外來鍵的名稱在資料庫中是否唯一。只需在金鑰名稱的末尾新增一些隨機字元即可對其進行測試。(感謝Niels的提示)
您的一個或兩個表是 MyISAM表。為了使用外來鍵,表必須都是InnoDB。(實際上,如果兩個表都是MyISAM,那麼您將不會收到錯誤訊息 - 它只是不會建立金鑰。)在查詢瀏覽器中,您可以指定表型別。
您已指定級聯  ON DELETE SET NULL,但相關鍵欄位設定為NOT NULL。您可以通過更改級聯或將欄位設定為允許NULL值來解決此問題。(感謝Sammy和J Jammin)
確保Charset和Collat​​e選項在表級別以及關鍵列的單個欄位級別相同。(感謝FRR提示)
您的外來鍵列上有一個預設值(即預設值= 0)(感謝Omar的提示)
關係中的一個欄位是組合(複合)鍵的一部分,並沒有它自己的單獨索引。即使該欄位具有索引作為複合鍵的一部分,您也必須僅為該鍵欄位建立單獨的索引,以便在約束中使用它。(感謝Alex提供的這個提示)
您在ALTER語句中有語法錯誤,或者您在關係中輸錯了一個欄位名稱(感謝Christian&Mateo的提示)
外來鍵的名稱超過64個字元的最大長度。(感謝Nyleta提示)
————————————————————————————————————————————————————————————————————————————
1.兩個表的欄位的型別必須一致
--------------------- 
作者:yangzaiqiu1986814 
來源:CSDN 
原文:https://blog.csdn.net/yangzaiqiu1986814/article/details/17009601 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

 

根據這位博主寫的提示,找到我的錯誤,兩個表型別必須是nnoDB,我的表有一個是 MyISAM表,導致表報錯。