2009-11-17 69 views
68

我必須在mysql中創建一個帶有2個表的數據庫,但腳本失敗,並顯示errno 150(外鍵問題)。我仔細檢查了兩個表上的外鍵字段是相同的,我找不到任何錯誤。Mysql。無法創建表errno 150

下面是腳本:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

DROP SCHEMA IF EXISTS `testdb`; 
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ; 
USE `testdb`; 

DROP TABLE IF EXISTS `testdb`.`table1` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 



DROP TABLE IF EXISTS `testdb`.`table2` ; 

CREATE TABLE IF NOT EXISTS `testdb`.`table2` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `field1` VARCHAR(50) NULL , 
    `date` DATE NULL , 
    `cnt` INT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `FK_table2_table1` (`field1` ASC) , 
    CONSTRAINT `FK_table2_table1` 
    FOREIGN KEY (`field1`) 
    REFERENCES `testdb`.`table1` (`field1`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

我已經與不同版本的MySQL試圖在Windows和Ubuntu和沒有工作。

任何想法?非常感謝。

+9

我還試圖通過創建一個FK約束表到另一個不存在的表來接收這個錯誤。這是一個容易解決的問題,由於完全無用的錯誤信息而變得非常困難。 – Cerin 2012-03-12 16:08:48

+2

對於那些從谷歌來的人來說,如果你在外鍵的表名上輸入錯誤,也會發生這個錯誤。 – 2013-11-26 17:39:11

回答

54

table1.field1沒有定義索引。

需要在field1上放置FOREIGN KEY約束條件。

有了這個:然後

CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
    `id` INT UNSIGNED NOT NULL , 
    `field1` VARCHAR(50) NULL , 
    KEY ix_table1_field1 (field1), 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 

一切都應該按預期工作。

+5

根據手冊,它不需要是唯一的。 – 2009-11-17 14:47:53

+0

'@Vilx:'正確,15個字符。 – Quassnoi 2009-11-17 14:49:50

+17

儘管它不適用於這種情況,但如果您嘗試添加外鍵約束,並且在刪除設置爲非可空列的空值時,您將得到相同的錯誤消息。 – 2012-11-09 02:32:41

13

根據MySQL的版本,您可能需要首先在table1.field1上創建一個索引。

1

如果實在不行,試試這個:

外鍵的名稱是一個已經存在的密鑰的副本。檢查您的外鍵的名稱在您的數據庫中是唯一的。只需在您的密鑰名稱末尾添加幾個隨機字符即可對此進行測試。

0

總是先創建主表/父表,然後創建您的詳細信息/子表。

5

一個選項(視情況而定),將禁止MySQL的完整性檢查:

SET FOREIGN_KEY_CHECKS = 0; 
0

對我來說,一個表是使用上還不存在其它表的外鍵約束。這是由於一個大的makefile造成的,所以沒有我期望的那麼明顯。

0

如果有人仍然有這個問題,我嘗試了上述所有解決方案(SET FOREIGN_KEY_CHECKS除外),並沒有任何工作。問題在於,當您引用第一個表時,某些數據庫對錶名稱區分大小寫。我覺得這很奇怪,因爲我從來沒有在MySQL和Oracle上看到過這種情況,現在MariaDB上發生了這種情況。

例如:

創建表,如果不存在CADASTRO_MAQUINAS( 標識VARCHAR(16), 主鍵(Id)的 );

創建表,如果不存在INFOS( Id_Maquina VARCHAR(16)NOT NULL, 約束FK_infos_cadastro_maquinas外鍵(Id_Maquina)引用CADASTRO_MAQUINAS(Id)的 );

如果我嘗試使用cadastro_maquinas(小寫)代替CADASTRO_MAQUINAS創建第二個表格,我將收到此錯誤。

0

我正在使用MySQL workBench。這個問題是你不能使用相同的foreign key name,他們需要是unique。所以如果多於一個表將引用相同的外鍵,則每次必須給出一個unique名稱。

50

在使用MySQL Workbench和MySQL 5.5.27時,我遇到了類似的問題。在我的情況下,問題是與INT類型字段。錯誤地在一張表中是INT UNSIGNED,在參考表中是INT。

+11

這正是我的問題。謝謝! – 2013-07-04 15:40:14

6

另一個提示:

即使你的數據類型似乎是相同的 - 在我的情況都列有VARCHAR(50) - 這是不夠的。

您還需要確保兩列具有相同的COLLATION

8

其中一個答案建議禁用外鍵完整性檢查。這是一個壞主意。這裏有兩種可能的罪魁禍首:引用的主鍵和引用外鍵

  • 指數之間

    • 數據類型不匹配。你索引的任何外鍵必須是非空
  • +1

    對我來說這是一個數據類型不匹配......感謝您的幫助! – sbditto85 2013-07-02 20:43:07

    +0

    NOT NULL參數不適用於我的Mysql 5.5 – 2016-05-16 16:30:23

    0

    我在我的一個表上有類似的錯誤。當檢查列Collat​​ion不同時,它曾將兩個列都更改爲相同的Collat​​ion類型。

    在閱讀了大部分建議的解決方案後。我只是想,如果我列出所有可能引發此錯誤的可能性,這可能會有所幫助。

    1,檢查CASE列 2,檢查列 3覈對,檢查是否存在是列在兩個表中創建的密鑰(唯一的,首要的)

    5

    又一原因,雖然略有相似給其他人:我指的是一張表,後來證明有MyISAM引擎,而不是InnoDB。

    0

    在我的情況下,我在其中一個表中得到了舊錶定義MyISAM,顯然我無法從另一個表中創建外鍵。也許這有助於某人。

    所以這可能是因爲兩個數據庫之間的不一致的發生/字段的定義嘗試檢查:如果你的錯誤輸入的參考表的名稱

    Field Type 
    Field Collation 
    Table Engine 
    
    5

    MySQL也將拋出此錯誤。我把我的頭髮過一段時間,直到我意識到我錯過了在foreign key (column1) references mistyped_table(column1)

    +0

    在某些情況下,表(表名)的情況很重要 - 有些情況不是。例如,我的腳本在OSX上的mysql上工作,但在Linux上我有這個errno:150問題。案件是我的問題。 – prule 2014-11-06 01:16:04

    +0

    同樣,我有'FOREIGN KEY(user_id)REFERENCES user(id)ON DELETE CASCADE',但'user'表沒有'id'字段 - 它被稱爲'user_id'!所以在上面,我將'user(id)'改爲'user(user_id)',並且所有的都在這個宇宙中再次出現......現在。 – elimisteve 2015-10-09 22:56:40

    0

    一封信給我,問題是用在CREATE TABLE查詢中使用CONSTRAINT

    0

    嘗試在外鍵中引用複合鍵時,您也可能會遇到相同的錯誤。

    例如:

    CREATE TABLE `article` (
        `id` int(10) unsigned NOT NULL, 
        `type` enum('X','Y','Z') NOT NULL, 
        PRIMARY KEY (`id`,`type`) 
    ) ENGINE InnoDB; 
    
    CREATE TABLE `t1` (
        `user_id` int(10) unsigned NOT NULL, 
        `type` enum('X','Y','Z') NOT NULL, 
        `article_id` int(10) unsigned NOT NULL, 
        CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE 
    ) ENGINE=InnoDB 
    

    在這種情況下,它們出現在文章表的主鍵定義中使用的article_id和類型字段在FK定義非常相同的順序是非常重要的。

    0

    在我的情況下,可能是一個服務器bug刪除一個同名的表。 刪除整個shcema並重新創建它解決了問題。

    0

    如果您正在使用MySQL工作臺,你會得到這個錯誤的關係表有可能是你一個快速的解決辦法:刪除它,讓MySQL工作臺重新創建它適合你。然後複製sql。修復了我的errno 150問題。

    0

    我在嘗試使用外鍵引用非唯一字段時出現此錯誤。 (其中apparently是不允許的)

    0

    當我遇到這個問題時,這是因爲我已經將第一個表中的ID設置爲unsigned而第二個表中的外鍵不是。讓他們都unsigned爲我修復它。

    相關問題