MySQL的Errno 150

我创build了几个简单的表,我不能通过这个外键错误,我不知道为什么。 这是下面的脚本。

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.无法创build表“336_project.sections”(errno:150)

我的数据types似乎是相同的,语法似乎是正确的。 任何人都可以指出我不在这里看到什么?

我正在使用MySQL Workbench 5.2

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

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

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

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

你可以跑

 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才能正常工作。

这是失败的

 ON DELETE set default 

我之前没有遇到过这种情况,而且我也没有在手册中看到它(但后来就迟到了)

更新

刚刚在手册中看到了这一点

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

我猜你可能使用InnoDB表?

这里问题在于数据库引擎(table1 MYISAM和table2 ENGINE )。 要设置外键,

  • 这两个表必须在相同的引擎和相同的字符集。
  • 父母和FK列中的PK列必须是相同的数据types和相同的归类types。

希望你有一个想法。

确保表types是InnoDB,MyISAM不支持外键afaik。

为了完整起见,如果您对当时没有定义的表进行外部引用,也会出现此错误;

为了创build一个引用另一个表的FOREIGN KEY ,来自两个表的键都应该是PRIMARY KEY并且具有相同的数据types。

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