2010-10-31 98 views
135

我想導入一個.sql文件及其在創建表時失敗。MySQL:無法創建表(錯誤:150)

這裏是一個失敗的查詢:

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL, 
`name` varchar(100) NOT NULL, 
`value` varchar(15) NOT NULL, 
UNIQUE KEY `id` (`id`,`name`), 
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1;  

我導出.SQL來自同一個數據庫,我放棄了所有的表,現在我嘗試導入它,它爲什麼會失敗?

MySQL: Can't create table './dbname/data.frm' (errno: 150)

+19

我發現,列必須是相同的(甚至是無符號標誌必須匹配)。 – 2012-12-19 19:54:14

+1

對於這個錯誤的基本所有原因,下面是在MySQL中導致errno 150(和errno 121 /其他外鍵錯誤)的詳盡資源。 – 2012-09-29 00:47:12

+3

@JohnSmith ...哪裏? – 2013-07-29 17:07:23

回答

148

MySQL - FOREIGN KEY Constraints Documentation

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the correct column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns Error 1005 and refers to Error 150 in the error message, which means that a foreign key constraint was not correctly formed. Similarly, if an ALTER TABLE fails due to Error 150, this means that a foreign key definition would be incorrectly formed for the altered table.

+1

一個表格中的兩列可以引用另一個表格中的一列,它是PK嗎? – Eugene 2011-11-05 00:16:21

+1

@Eugene:兩列中的每一列都可以與另一個表中的PK具有外鍵關係 - 並非兩個列都是單個外鍵關係。 – 2011-11-05 01:04:11

+1

@OMGPonies:感謝您回答這個問題!我一直在尋找它...我也在這裏問了一個問題http://stackoverflow.com/questions/13487010/how-to-update-same-table-on-刪除在MySQL中....雖然我有一些很好的答案,但我想要符合'是否有可能爲我的問題編寫嵌套查詢'? ..我會要求你也請回答我! – 2012-11-21 15:32:08

89

錯誤150表示您的外鍵有問題。可能外表上的關鍵字不是完全相同的類型?

+14

謝謝:)對我來說,數據類型是INT,但一個是無符號的,另一個不是 – 2014-03-04 09:20:52

+4

當使用模式生成器時,我經常運行'BIGINT'和'INT'。 – Xeoncross 2014-08-29 19:20:04

+0

當外鍵不是INT值時,我遇到了同樣的問題。當外鍵引用它時,該列必須是唯一的。 – PhatHV 2015-09-21 09:23:22

10

錯誤編號。 150意味着外鍵約束失敗。您可能在外鍵依賴的表之前創建此表(表keywords)。首先創建該表,它應該可以正常工作。

如果沒有,請刪除外鍵聲明並在創建表後添加它 - 您將得到關於特定約束失敗的更有意義的錯誤消息。

26

數據類型必須完全匹配。如果您正在處理varchar類型,則表格必須使用相同的排序規則。

+3

感謝您的排序位。 – arahant 2014-05-25 18:00:08

18

在某些情況下,如果相關表之間存在不同的引擎,則可能會遇到此錯誤消息。例如,一個表可能使用InnoDB,而另一個表使用MyISAM。兩者都需要是相同

+0

謝謝 - 這是我的問題。 – scipilot 2014-11-05 23:37:32

+0

這是我的問題。謝謝 – thed0ctor 2014-12-03 01:54:33

+0

如果您使用mysqldump創建了一個innodb表的sql文件,並將它們導出爲myisam talbs,則會發生這種情況。 – 2017-01-03 22:51:04

2

更改你的表的引擎,只有InnoDB支持外鍵

-6

嘗試:

CREATE TABLE `data` (
    `id` int(10) unsigned NOT NULL, 
    `name` varchar(100) NOT NULL, 
    `value` varchar(15) NOT NULL, 
UNIQUE KEY `id` (`id`,`name`), 
CONSTRAINT `data_ibfk_1`, 
FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

你需要把一個「」之間CONSTRAINTFOREIGN

0

也許this會有幫助嗎?主鍵列的定義應該與外鍵列完全相同。

2

如果一個CHARSET創建了PK臺,然後你在另一個CHARSET..then創建FK表還可能會得到這個錯誤...我也得到了這個錯誤,但改變字符集,以PK的字符集,然後經過它沒有錯誤

create table users 
(
------------ 
------------- 
)DEFAULT CHARSET=latin1; 


create table Emp 
(
--------- 
--------- 
--------- 
FOREIGN KEY (userid) REFERENCES users(id) on update cascade on delete cascade)ENGINE=InnoDB, DEFAULT CHARSET=latin1; 
0

得到執行確保所有表支持外鍵 - InnoDB引擎

22

我認爲所有這些問題的答案,而正確的被誤導的問題。

實際的答案是這樣的,你開始恢復,如果你恢復一個轉儲文件與外鍵前:

SET FOREIGN_KEY_CHECKS=0; 

,因爲自然的恢復將創建一些限制外國表甚至存在了。

3

在瀏覽完上面的答案並嘗試了一下之後,這是解決MySQL中的外鍵錯誤(1005 - 錯誤150)的有效方法。

爲了正確創建的外鍵,所有的MySQL請求是:

  • 所有被引用的鍵必須有主鍵或唯一索引。
  • 再次引用列必須與引用列具有相同的數據類型。

滿足這些要求,一切都會好起來的。

7

有時MySQL只是超級愚蠢 - 我可以理解外鍵的原因..但在我的情況下,我剛剛刪除了整個數據庫,我仍然得到錯誤...爲什麼?我的意思是,沒有數據庫了......而且我使用的sql-user無法訪問服務器上的任何其他數據庫...我的意思是,服務器對於當前用戶是「空的」,我仍然可以獲得這個錯誤?很抱歉,但我猜MySQL是在騙我...但我可以對付它:)只需添加SQL的這兩條線在你的fucky聲明:

SET FOREIGN_KEY_CHECKS = 0; 
# some code that gives you errno: 150 
SET FOREIGN_KEY_CHECKS = 1; 

現在SQL應執行......如果你真的有一個外鍵問題,它會顯示給你的行,你將再次啓用檢查 - 這將失敗,然後..但我的服務器只是安靜:)

+0

如果在其引用的列和列之間存在實際差異,則可能會導致問題。例如。假設被引用的列是一個varchar(200),並且引用者是varchar(50),那麼當嘗試級聯時可能會出現奇怪的行爲。我沒有遇到由於數據不匹配而發佈errno 150的問題。 – juacala 2015-03-18 17:39:10

+0

有趣的見解@juacala :)對我來說很有趣,只要我遇到這個問題,我的方法總是修復它......直到今天至少:D但我們從未停止學習,對;) – jebbie 2015-03-19 15:35:30

+0

這實際上幫助了我一個腳本liquibase產生。腳本在MySQL> 5.5上完美運行,但5.1版失敗。 – delbertooo 2015-10-20 12:38:58

1

請確保您的主鍵列和引用列具有相同的數據類型和屬性(無符號,二進制,無符號零填充等)。

2

如果兩個表都有引用,例如,一個表是Student並且另一個表是Education,並且我們希望Education表具有Student表的外鍵引用,則會發生此錯誤。在這種情況下,兩個表的列數據類型應該相同,否則會產生錯誤。

2

我在將Windows應用程序移植到Linux時遇到此錯誤。在Windows中,數據庫表名不區分大小寫,在Linux中它們區分大小寫,可能是因爲文件系統的差異。所以,在Windows桌Table1table1相同,並在REFERENCEStable1Table1工作。在Linux上,當應用程序使用table1而不是Table1創建數據庫結構時,我看到錯誤#150;當我在Table1引用中做出正確的字符大小寫時,它也開始在Linux上工作。因此,如果沒有其他幫助,請確保在REFERENCES中,當您在Linux上時,在表名中使用正確的字符大小寫。

47

通過運行SHOW ENGINE INNODB STATUS;,然後在輸出中查找LATEST FOREIGN KEY ERROR,可以得到實際的錯誤消息。

來源:answer from another user in a similar question

+7

這實際上非常有用。它會告訴你確切的錯誤。 – 2014-09-04 23:34:37

+0

謝謝。這是一個恥辱MySQL Workbench沒有使用這個。 – scipilot 2014-11-05 23:38:08

+0

太棒了。這非常有幫助。告訴你確切的錯誤。 我的是,已經將NULLABLE列設置爲「on delete set null」。 非常感謝。 – 2016-07-01 12:09:26

1

一個真正的邊緣的情況是,你已經使用了MySQL的工具,(續集臨在我的情況),以重命名數據庫。然後創建一個具有相同名稱的數據庫。

這將外鍵約束保存到相同的數據庫名稱,因此重命名的數據庫(例如,my_db_renamed)在新創建的數據庫中有外鍵約束(my_db)

不知道這是Sequel Pro中的錯誤,還是某些用例需要此行爲,但它花費了我一大早的部分時間:/

0

您從子表引用的PARENT表的列必須是唯一的。如果不是,導致錯誤號150.

+0

它可能會值得您添加更多的細節 - 例如特定的列和表名 – Jonathan 2014-11-22 19:12:39

1

我有同樣的錯誤。在我的情況下,錯誤的原因是我在約束中有一個ON DELETE SET NULL語句,而我在其中定義約束的字段有一個NOT NULL語句。在該字段中允許NULL解決了該問題。

8

有相當可能會導致錯誤號150,所以人們尋找這個話題,這裏就是我的想法是接近詳盡的列表(來源Causes of Errno 150)的幾件事情:

對於錯誤號150或錯誤號121,只需輸入SHOW ENGINE INNODB STATUS,就會出現一個名爲「最新的外鍵錯誤」的部分。在此之下,它會給你一個非常有用的錯誤信息,它通常會立即告訴你什麼是問題。你需要SUPER權限來運行它,所以如果你沒有這些權限,你只需要測試下面的場景。

1)數據類型不匹配:該類型的列必須是同一

2)父母列沒有索引(或錯序索引)

3)列的排序規則唐」牛逼比賽

4)NOT NULL列

5)表的排序規則不匹配使用SET NULL:即使列排序規則匹配,在一些版本的MySQL這可能是一個問題。

6)父列實際上不存在於父表中。檢查拼寫(可能在列的開頭或結尾處有空格)

7)其中一列的索引之一不完整,或者列對於完整索引太長。請注意,MySQL(除非你調整它)具有767字節的最大單列密鑰長度(這對應於varchar(255)UTF列)

如果你得到一個errno 121,這裏有幾個原因:

1)您選擇的約束名已被

2)在某些系統上是否有你的陳述和表名的情況不同。如果您從一臺服務器轉到另一臺有不同的案例處理規則的服務器,這可能會讓您感到困擾。

+0

在某些版本中,如果表不是innodb,則會得到errno 150,但在某些版本中它只是失敗而已。 – juacala 2015-04-14 14:54:35

+0

謝謝,這真是太棒了: | ------------------------ |最新的外鍵錯誤 | ------------------------ |您已經定義了一個SET NULL條件,雖然有些是 |列被定義爲NOT NULL。 – 2018-01-24 10:53:49

2

在大多數的情況下,問題是由於發動機的區別。如果是InnoDB的創建,然後父受的MyISAM &反之亦然創建應該引用表

0

我展開反傾銷調查時,也有類似的問題Django的mysql數據庫與單個表。我可以通過將數據庫轉儲到文本文件來解決問題,使用emacs將相關表移動到文件末尾,並將修改的sql轉儲文件導入到新實例中。

HTH Uwe

1

在我的情況。我有引擎和字符集問題,因爲我的主機服務器更改設置,我的新表是MyISAM,但我的舊錶是InnoDB。只是我改變了。

0

我從文本文件創建數據庫時遇到過這種問題。

mysql -uroot -padmin < E:\important\sampdb\createdb.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\create_student.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\create_absence.sql 

mysql -uroot -padmin sampdb < E:\important\sampdb\insert_student.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\insert_absence.sql 

mysql -uroot -padmin sampdb < E:\important\sampdb\load_student.sql 
mysql -uroot -padmin sampdb < E:\important\sampdb\load_absence.sql 

我只是寫了上面的行中Create.bat和運行批處理文件。

我的錯誤是在我的sql文件中的執行順序。我試圖用主鍵和外鍵創建表。運行時它將搜索參考表,但表不在那裏。 所以它會返回那種錯誤。

If you creating tables with foreign key then check the reference tables were present or not. And also check the name of the reference tables and fields.

0

我已經通過使變量接受null

ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL 
1

我也有類似的問題,糾正問題,但我的是因爲我加入一個新的領域是有數據的現有表,新字段引用父表中的另一個字段,並且還具有NOT NULL的定義並且沒有任何默認值。 - 我發現事情不工作的原因是因爲

  1. 我的新領域需要有從父表上的每個記錄的值自動填充空白的領域,可應用於約束之前。每次應用約束時,都需要保持表格數據的完整性。實施約束(外鍵),但有跡象表明沒有從父表中的值將意味着數據被損壞因此MySQL將永遠不會執行你的約束

重要的是要記住,在某些數據庫記錄如果正常情況下你計劃你的數據庫以及時間提前,並實現了這種特定的情況就可以避免

更簡單的方法來避免這種疑難雜症數據插入前限制是

  • 薩已經數據庫表中的數據
  • 截斷表數據(並表的文物,即索引等)
  • 種種限制
  • 導入數據

我希望這可以幫助別人

0

我得到了執行一系列MySQL命令時也出現同樣的問題。當創建一個表的時候,我們會在引用一個尚未創建的其他表的外鍵時發生。這是參考前表格存在的順序。

解決方案:在創建具有外鍵的子表之前先創建父表。

0

創建沒有外鍵的表,然後分別設置外鍵。

0

usually, the mismatch between foreign key & primary key causes the error:150.

外鍵必須具有相同的數據類型作爲主鍵。另外,如果主鍵無符號那麼外鍵也必須是無符號

4

我同樣的錯誤,然後我創建第一個引用的表,然後簡稱表

for example if you have employee and department tables your assigning foreign constraint on dept_no in employee table then make sure that the department table is created and have assigned primary key constraints to dept_no.

這個工作對我來說...

相關問題