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

Con*_*ius 10 mysql foreign-keys mysql-error-1005

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

我使用MySQL 5.5.31,代码在这里:CREATE DATABASE TOS;

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));
Run Code Online (Sandbox Code Playgroud)

错误:

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

任何帮助将不胜感激.

Mic*_*ski 19

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

这看起来是表名中的区分大小写Bill_Header(应该是BILL_HEADER).
来自MySQL文档的标识符区分大小写:

在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));
Run Code Online (Sandbox Code Playgroud)

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

  • 在我的情况下,父表和子表之间存在字段整理不匹配. (3认同)
  • 另一个微妙的问题是字符集必须匹配。我刚刚遇到了我引用的表是 utf8 的情况,但它试图在 latin-1 表上创建一个新约束。一旦我在创建表中指定了 ut8,一切都很好。 (2认同)

pil*_*ice 6

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