MySQL的errno的150(MySQL Errno 150)

2019-09-01 04:37发布

我创建了几个简单的表格,我无法获得通过该外键的错误,我不知道为什么。 这里是下面的脚本。

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工作台5.2

Answer 1:

如果您使用的是InnoDB引擎, ON DELETE SET DEFAULT是你的问题。 下面是手动的摘录:

虽然默认设置由MySQL服务器允许的,由InnoDB的为无效被拒绝。 CREATE TABLE和ALTER使用此子句TABLE语句不允许InnoDB表。

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



Answer 2:

这个错误也,如果你与不同类型的列,如发生。 诠释在目标表中的源表和BigInt有。



Answer 3:

您可以运行

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.


Answer 4:

这也可能是,如果你不指定的情况下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;

上述将抛出错误号150。 一个需要改变的第一个表InnoDB的太这个工作。



Answer 5:

为了创建一个FOREIGN KEY参照另一个表,这两个表中的键应该是PRIMARY KEY并用相同的数据类型。

在你的桌子部分, PRIMARY KEY是不同的数据类型,即INT但在另一个表,它的类型,例如VARCHAR



Answer 6:

这是失败的

ON DELETE set default 

我还没有碰到过,以前,我没有看到它在说明书或者(但那么晚)

更新

刚刚看到这个在手册

虽然默认设置由MySQL服务器允许的,由InnoDB的为无效被拒绝。 CREATE TABLE和ALTER使用此子句TABLE语句不允许InnoDB表。

我猜你可能会使用InnoDB表?



Answer 7:

这里的问题是数据库引擎(表1 MYISAM和表2 ENGINE )。 要设置外键,

  • 这两个表必须在相同的发动机和相同的字符集。
  • 在父母FK列PK列必须是在相同的数据类型和相同的排序规则类型。

希望你有一个想法。



Answer 8:

确保表类型是InnoDB的,MyISAM不支持外键,据我所知。



Answer 9:

为了完整起见 - 你也会,如果你让一个外国引用未在时间定义的表得到这个错误;



文章来源: MySQL Errno 150