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 CASCADE
或ON 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
。