MySQL Errno 150

时间:2013-04-26 01:13:01

标签: mysql foreign-keys mysql-workbench

我正在创建一些简单的表,我无法传递这个外键错误,我不知道为什么。这是下面的脚本。

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

9 个答案:

答案 0 :(得分:35)

如果您要关联不同类型的列,也会发生此错误,例如。源表中的int和目标表中的BigInt。

答案 1 :(得分:24)

如果您使用的是InnoDB引擎,ON DELETE SET DEFAULT就是您的问题。以下是手册的摘录:

  
    

虽然MySQL服务器允许SET DEFAULT,但它被InnoDB拒绝为无效。 InnoDB表不允许使用此子句的CREATE TABLE和ALTER TABLE语句。

  

您可以使用ON DELETE CASCADEON DELETE SET NULL,但不能使用ON DELETE SET DEFAULT。有更多信息here

答案 2 :(得分:18)

你可以运行

SHOW ENGINE INNODB STATUS

以人类可读的格式阅读失败的原因

e.g。

------------------------
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.

答案 3 :(得分:3)

如果你没有指定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才能使其正常工作。

答案 4 :(得分:3)

为了创建引用另一个表的FOREIGN KEY,两个表中的键应为PRIMARY KEY且具有相同的数据类型。

在您的表格部分中,PRIMARY KEY具有不同的数据类型,即INT,但在另一个表中,它的类型为VARCHAR

答案 5 :(得分:1)

失败了
ON DELETE set default 

我之前没有遇到过这种情况,我也没有在手册中看到它(但后来却很晚)

更新

刚刚在manual

中看到了这一点
  

虽然MySQL服务器允许SET DEFAULT,但它被拒绝为   InnoDB无效。使用此CREATE TABLE和ALTER TABLE语句   InnoDB表不允许使用子句。

我猜你可能正在使用InnoDB表吗?

答案 6 :(得分:0)

此问题出现在数据库引擎中(table1 MYISAM和table2 ENGINE)。 要设置FOREIGN KEYs,

  • 两个表必须位于同一个ENGINE和相同的字符集中。
  • 父级和FK列中的PK列必须是相同的数据类型和相同的排序规则类型。

希望你有个主意。

答案 7 :(得分:0)

确保表类型为InnoDB,MyISAM不支持外键,afaik。

答案 8 :(得分:0)

为了完整起见 - 如果您对当时未定义的表进行外部引用,您也会收到此错误;