簡體   English   中英

MySQL Errno 150

[英]MySQL Errno 150

我正在創建一些簡單的表,我無法通過這個外鍵錯誤,我不知道為什么。 這是下面的腳本。

create TABLE Instructors (

ID varchar(10),
First_Name varchar(50) NOT NULL,
Last_Name varchar(50) NOT NULL,
PRIMARY KEY (ID)
);

create table Courses (

Course_Code varchar(10),
Title varchar(50) NOT NULL,
PRIMARY KEY (Course_Code)

);


create table Sections (
Index_No int,
Course_Code varchar(10),
Instructor_ID varchar(10),
PRIMARY KEY (Index_No),
FOREIGN KEY (Course_Code) REFERENCES Courses(Course_Code)
    ON DELETE cascade
    ON UPDATE cascade,
FOREIGN KEY (Instructor_ID) REFERENCES Instructors(ID)
    ON DELETE set default

);

錯誤代碼:1005。無法創建表'336_project.sections'(錯誤號:150)

我的數據類型看起來相同,語法似乎正確。 任何人都可以指出我在這里沒有看到的東西嗎?

我正在使用MySQL Workbench 5.2

如果您要關聯不同類型的列,也會發生此錯誤,例如。 源表中的int和目標表中的BigInt。

如果您正在使用InnoDB引擎,那么ON DELETE SET DEFAULT就是您的問題。 以下是手冊的摘錄:

雖然MySQL服務器允許SET DEFAULT,但它被InnoDB拒絕為無效。 InnoDB表不允許使用此子句的CREATE TABLE和ALTER TABLE語句。

您可以使用ON DELETE CASCADEON DELETE SET NULL ,但不能使用ON DELETE SET DEFAULT 還有更多的信息在這里

你可以跑

SHOW ENGINE INNODB STATUS

以人類可讀的格式閱讀失敗的原因

例如

------------------------
LATEST FOREIGN KEY ERROR
------------------------
150331 15:51:01 Error in foreign key constraint of table foobar/#sql-413_81:
FOREIGN KEY (`user_id`) REFERENCES `foobar`.`users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE:
You have defined a SET NULL condition though some of the columns are defined as NOT NULL.

如果你沒有指定ON DELETE但是試圖從InnoDB表引用MYISAM表,也可能是這種情況:

CREATE TABLE `table1`(
    `id` INT UNSIGNED NOT NULL,
    `name` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MYISAM CHARACTER SET UTF8;

CREATE TABLE `table2`(
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `table1_id` INT UNSIGNED NOT NULL,
    `some_value` VARCHAR(255) NOT NULL,


    PRIMARY KEY (`id`),
    KEY `fk_table1_id`(`table1_id`),

    CONSTRAINT FOREIGN KEY (`table1_id`) REFERENCES `table1`(`id`)
) ENGINE=INNODB CHARACTER SET UTF8;

以上將拋出errno 150 需要將第一個表更改為InnoDB才能使其正常工作。

為了創建引用另一個表的FOREIGN KEY ,兩個表中的鍵應該是PRIMARY KEY並且具有相同的數據類型。

在您的表部分中, PRIMARY KEY具有不同的數據類型,即INT但在另一個表中,它的類型是VARCHAR

它失敗了

ON DELETE set default 

我之前沒有遇到過這種情況,我也沒有在手冊中看到它(但后來才推遲)

更新

剛剛在手冊中看到了這一點

雖然MySQL服務器允許SET DEFAULT,但它被InnoDB拒絕為無效。 InnoDB表不允許使用此子句的CREATE TABLE和ALTER TABLE語句。

我想你可能正在使用InnoDB表?

這里問題出現在數據庫引擎中(table1 MYISAM和table2 ENGINE )。 要設置FOREIGN KEYs,

  • 兩個表必須位於相同的ENGINE和相同的字符集中。
  • 父級和FK列中的PK列必須位於相同的數據類型和相同的排序規則類型中。

希望你有個主意。

確保表類型為InnoDB,MyISAM不支持外鍵,afaik。

為了完整起見 - 如果您對當時未定義的表進行外部引用,您也會收到此錯誤;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM