2013-11-23 89 views
10

我想建立我的系統的數據庫和表。但是我發現如果我不在代碼中添加外鍵。沒有錯誤。我使用了很多方法試圖使代碼有效,但它仍然有錯誤。MySQL的外鍵,不能創建表(errno:150)

我使用的是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)); 

錯誤:

1005 - Can't create table 'TOS.BILL_ITEM' (errno: 150)

任何幫助將不勝感激。

+0

它似乎工作,如果我刪除'DROP'語句.. http://sqlfiddle.com/#!2/08d1e –

+2

通常,錯誤150是外鍵錯誤,由於數據類型和長度不匹配列與關係之間或主列上缺少索引。你確實擁有所有正確的類型和PK索引。 –

+0

您可以嘗試只刪除其中一個外鍵以縮小問題範圍嗎? –

回答

17

非描述性錯誤150通常與外鍵數據類型或長度不匹配或父表的列中缺少索引有關。

這看起來是表名Bill_Header(應該是BILL_HEADER)中的區分大小寫。
From the MySQL docs on identifier case sensitivity:

In MySQL, databases correspond to directories within the data directory. Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database and table names. This means database and table names are not case sensitive in Windows, and case sensitive in most varieties of 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)的底層平臺必須不存在區分大小寫。

+0

謝謝,它的作品!非常感謝你。 – Confucius

+3

在我的情況下,父表和子表之間存在字段整理不匹配。 – Serge

+1

另一個微妙的問題是字符集必須匹配。我剛剛遇到了這個表,我引用的表是utf8,但它試圖在拉丁表1上創建一個新的約束。一旦我在create table中指定了ut8,一切都很好。 – Felix

5

上面的回答是正確的,但如果您的外鍵引用的表是MyISAM而不是innoDB,也會發生此錯誤。

+0

或者如果父表具有指定的DEFAULT CHARSET,並且子表或者沒有指定它或指定不同的DEFAULT CHARSET。 –