web-dev-qa-db-ja.com

MySQL外部キー、テーブルを作成できません(エラー番号:150)

システムのデータベースとテーブルを構築しようとしています。しかし、コードに外部キーを追加しないと、私はそれを発見しました。エラーはありません。私は多くの方法を使ってコードを機能させようとしましたが、それでもエラーが発生します。

私はMySQL 5.5.31を使用しており、コードは次のとおりです。CREATEDATABASE 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)

どんな助けでも大歓迎です。

10
Confucius

非記述子エラー150は通常、外部キーのデータ型または長さの不一致、または親テーブルの列に欠落しているインデックスに関連しています。

これは、テーブル名Bill_HeaderBILL_HEADERである必要があります)での大文字と小文字の区別の問題のように見えます。
識別子の大文字と小文字の区別に関するMySQLドキュメントから:

MySQLでは、データベースはデータディレクトリ内のディレクトリに対応します。データベース内の各テーブルは、データベースディレクトリ内の少なくとも1つのファイルに対応します(ストレージエンジンによってはさらに多くのファイルに対応します)。したがって、基になるオペレーティングシステムの大文字と小文字の区別は、データベース名とテーブル名の大文字と小文字の区別に影響します。つまり、データベース名とテーブル名では、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 )でそのまま機能したため、基盤となるプラットフォームでは大文字と小文字が区別されません。

19

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

6
pilavdzice