我正在创建一些简单的表,我无法传递这个外键错误,我不知道为什么。这是下面的脚本。
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
答案 0 :(得分:35)
如果您要关联不同类型的列,也会发生此错误,例如。源表中的int和目标表中的BigInt。
答案 1 :(得分:24)
如果您使用的是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
。有更多信息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,
希望你有个主意。
答案 7 :(得分:0)
确保表类型为InnoDB,MyISAM不支持外键,afaik。
答案 8 :(得分:0)
为了完整起见 - 如果您对当时未定义的表进行外部引用,您也会收到此错误;