我正在尝试为我的系统构建数据库和表。但我发现如果我不在代码中添加外键。没有错误。我已经使用了很多方法尝试使代码工作,但它仍然有错误。
我正在使用MySQL 5.5.31,以及这里的代码: 创建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));
错误:
1005 - 无法创建表'TOS.BILL_ITEM'(错误号:150)
非常感谢任何帮助。
答案 0 :(得分:18)
非描述性错误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)上工作,因此基础平台不得区分大小写。
答案 1 :(得分:6)
上面的答案是正确的,但如果您的外键引用的表是MyISAM而不是innoDB,也会发生此错误。