MySQL 外键,无法创建表(错误号:150)

Posted

技术标签:

【中文标题】MySQL 外键,无法创建表(错误号:150)【英文标题】:MySQL Foreign Key, Can't create table (errno: 150) 【发布时间】:2013-12-08 14:45:30 【问题描述】:

我正在尝试为我的系统构建数据库和表。但是我发现如果我不在代码中添加外键。没有错误。我使用了很多方法尝试使代码正常工作,但仍然有错误。

我使用的是 mysql 5.5.31,这里的代码: 创建数据库服务条款;

DROP TABLE TOS.USER CASCADE;
DROP TABLE TOS.BILL_HEADER CASCADE;
DROP TABLE TOS.TOY CASCADE;


CREATE TABLE TOS.USER
(User Char(8),
Name Char(10),
Type Char(1),
Password Char(12),
PRIMARY KEY(User));

CREATE TABLE TOS.BILL_HEADER
(Bill_No Char(10),
CTime DateTime,
No_Of INTEGER,
Cus_No Char(5),
DTime DateTime,
PRIMARY KEY(Bill_No));

CREATE TABLE TOS.TOY
(Toy_Id Char(10),
FullN Char(50),
ShortN Char(20),
Descrip Char(20),
Price DECIMAL,
Avail Char(1),
Cat Char(1),
PRIMARY KEY(Toy_Id));

CREATE TABLE TOS.BILL_ITEM
(Bill_No Char(10),
BSeq_No INTEGER,
Toy_Id Char(10),
OTime DateTime,
Quan INT,
DCondition Char(1),
PRIMARY KEY(Bill_No,BSeq_No),
FOREIGN KEY(Bill_No) REFERENCES TOS.Bill_Header(Bill_No),
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id));

错误:

1005 - 无法创建表“TOS.BILL_ITEM”(错误号:150)

任何帮助将不胜感激。

【问题讨论】:

如果我删除 DROP 语句,它似乎确实有效.. sqlfiddle.com/#!2/08d1e 通常,err 150 是外键错误,原因是列和关系之间的数据类型和长度不匹配,或者主列上缺少索引。不过,您确实定义了所有正确的类型和 PK 索引。 您能否尝试仅删除一个外键来缩小问题范围? 【参考方案1】:

非描述性错误 150 通常与外键数据类型或长度不匹配,或父表列上缺少索引有关。

这看起来是表名Bill_Header(应该是BILL_HEADER)区分大小写的问题。From the MySQL docs on identifier case sensitivity:

在 MySQL 中,数据库对应于数据目录中的目录。数据库中的每个表对应于数据库目录中的至少一个文件(可能更多,取决于存储引擎)。因此,底层操作系统的大小写敏感性在数据库和表名的大小写敏感性中起作用。这意味着数据库和表名在 Windows 中不区分大小写,而在大多数 Unix 中区分大小写。

修复案例,它应该可以工作:

CREATE TABLE TOS.BILL_ITEM
(Bill_No Char(10),
BSeq_No INTEGER,
Toy_Id Char(10),
OTime DateTime,
Quan INT,
DCondition Char(1),
PRIMARY KEY(Bill_No,BSeq_No),
FOREIGN KEY(Bill_No) REFERENCES TOS.BILL_HEADER(Bill_No),
# Here-----------------------------^^^^^^^^^^^^^^
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id));

由于您的代码在 SQLFiddle.com (http://sqlfiddle.com/#!2/08d1e) 上按原样工作,因此底层平台不能区分大小写。

【讨论】:

在我的情况下,父表和子表之间存在字段整理不匹配。 另一个微妙的问题是字符集必须匹配。我刚刚遇到了这个我引用的表是 utf8 的地方,但它试图在 latin-1 表上创建一个新的约束。一旦我在创建表中指定了 ut8,一切都很好。 还检查外键字段上的有符号与无符号不匹配【参考方案2】:

以上答案是正确的,但如果您的外键引用的表是 MyISAM 而不是 innoDB,也会发生此错误。

【讨论】:

或者,如果父表指定了 DEFAULT CHARSET,而子表要么没有指定,要么指定了不同的 DEFAULT CHARSET。

以上是关于MySQL 外键,无法创建表(错误号:150)的主要内容,如果未能解决你的问题,请参考以下文章

创建带有外键错误号的 sql 表:150

Mysql:无法创建表 errno 150

MySQL创建表:错误1005 errno:150“外键约束形成错误”

错误代码:1005。无法创建表“...”(错误号:150)

MySQL:无法创建表(错误号:150)

MySQL:无法创建表(错误号:150)