21

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

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

4

9 回答 9

35

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

于 2013-12-04T15:12:15.180 回答
24

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

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

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

于 2013-04-26T01:28:32.260 回答
20

你可以跑

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.
于 2015-03-31T16:01:03.080 回答
4

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

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

于 2017-10-19T03:55:51.003 回答
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 才能正常工作。

于 2013-11-25T11:05:29.460 回答
1

它在

ON DELETE set default 

我以前没有遇到过,我也没有在手册中看到它(但是已经很晚了)

更新

刚刚在手册中看到这个

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

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

于 2013-04-26T01:27:46.100 回答
1

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

于 2016-02-26T17:07:53.050 回答
0

Here Problem is in database engine ( table1 MYISAM and table2 ENGINE). To set FOREIGN KEYs,

  • Both table must be in same ENGINE and same charset.
  • PK column in parent and FK column must be in same data type and same collation type.

Hope you got an idea.

于 2015-01-23T05:05:57.320 回答
0

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

于 2015-11-30T23:21:33.453 回答