システムのデータベースとテーブルを構築しようとしています。しかし、コードに外部キーを追加しないと、私はそれを発見しました。エラーはありません。私は多くの方法を使ってコードを機能させようとしましたが、それでもエラーが発生します。
私は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)
どんな助けでも大歓迎です。
非記述子エラー150は通常、外部キーのデータ型または長さの不一致、または親テーブルの列に欠落しているインデックスに関連しています。
これは、テーブル名Bill_Header
(BILL_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 )でそのまま機能したため、基盤となるプラットフォームでは大文字と小文字が区別されません。
上記の答えは正しいですが、このエラーは、外部キーが参照しているテーブルがinnoDBではなくMyISAMである場合にも発生する可能性があります。