2013-11-23 45 views
10

私のシステムのデータベースとテーブルを構築しようとしています。しかし、コードに外部キーを追加しないと、私はそれを発見しました。エラーはありません。私はコードを動作させるために多くのメソッドを試しましたが、それでもエラーがあります。MySQLの外部キー、テーブルを作成できません(エラー番号:150)

私は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 - Can't create table 'TOS.BILL_ITEM' (errno: 150)

任意の助けいただければ幸いです。

+0

'DROP'文を削除すると動作するようです。http://sqlfiddle.com/#!2/08d1e –

+2

通常、データ型と長さの不一致により、エラー150が外部キーエラーです列とリレーションの間、またはプライマリ列の欠落したインデックス。あなたはすべての正しいタイプとPKインデックスが定義されています。 –

+0

問題を絞り込むために外部キーの1つだけを削除しようとしますか? –

答えて

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だった場所でこれを実行しましたが、latin-1テーブルに新しい制約を作成しようとしていました。いったん私がut8をcreateテーブルで指定すると、すべてうまくいきました。 – Felix

5

上記の答えは正しいですが、このエラーは、外部キーが参照しているテーブルがinnoDBではなくMyISAMである場合にも発生します。

+0

または、親テーブルにDEFAULT CHARSETが指定されていて、子テーブルに指定されていないか、別のDEFAULT CHARSETが指定されている。 –

関連する問題