2009-11-29 18 views
8

MySQLバージョン5.1で3つのテーブルを参照するために、次のスクリプトを作成しました。 InnoDBを使用して3つのテーブルがすべて作成され、3つのテーブルのすべてがINTとして定義されたIDカラムを持ちます。外部キーとMySQLエラー

私はACCOUNTとPERSONを参照するのに他のテーブルを作成しましたが、これはADDRESSを参照する最初のテーブルなので、そのテーブルの定義を以下のように実行しました。

エラーは、エラー1005(HY000)とerrno 150です。これは、外部キーの作成に関連するとわかります。

失敗したスクリプトは(単純化のために削除余分な列)である:

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ACCOUNT_ID INT NOT NULL, 
    CUSTOMER_ID INT NOT NULL, 
    SALES_ID INT, 
    TRADES_ID INT, 
    LOCATION_ID INT NOT NULL, 
    INDEX CUST_INDEX(CUSTOMER_ID), 
    INDEX SALES_INDEX(SALES_ID), 
    INDEX TRADES_INDEX(TRADES_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    INDEX LOCATION_INDEX(LOCATION_ID), 
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE, 
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL 
) ENGINE=InnoDB; 

ADDRESSテーブルを作成するために使用されるSQL文が(余分な列を簡単にするために除去される)以下です。

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    PERSON_ID INT NOT NULL, 
    ACCOUNT_ID INT NOT NULL, 
    ADDRESS_L1 VARCHAR(50), 
    ADDRESS_L2 VARCHAR(50), 
    CITY VARCHAR(25), 
    PROVINCE VARCHAR(20), 
    POSTAL_CODE VARCHAR(6), 
    COUNTRY VARCHAR(25), 
    INDEX CUST_INDEX(PERSON_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

私は同様の問題に対処するここにいくつかの質問を通じて閲覧しましたが、ほとんどは、重複定義と一致しないフィールド型だけでなく、いくつかは、1つまたはテーブルの他のためのInnoDBを使用していないように見えます。しかし、これらのどれも問題ではないようです。何か案は?

+2

:出力に埋葬することは「150」エラーの原因となった正確に何の詳細を持っているだろう「LATEST FOREIGN KEY ERROR」セクションになりますLOCATION_IDはNOT NULLとして定義されているためです。私は、制約の作成中にmysqlがこれをチェックしたとは思わなかった... – grossvogel

+0

ありがとうございました!それを回答として投稿すると、正しいとマークします。 – Elie

答えて

13

「SHOW ENGINE INNODB STATUS」コマンドはいつでも発行できます。 、LOCATION_IDキーのあなたのDELETEアクションはかなり右を見ていない

mysql> create table a (x int not null) type=innodb; 
Query OK, 0 rows affected, 1 warning (0.02 sec) 

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb; 
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150) 

mysql> show engine innodb status; 
[..... snip snip snip ...] 
------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
091129 16:32:41 Error in foreign key constraint of table test/b: 
foreign key (y) references a (x) on delete set null) type=innodb: 
You have defined a SET NULL condition though some of the 
columns are defined as NOT NULL. 
[.... snip snip snip ...] 
+0

クールで、毎日何か新しいことを学ぶ(それは、私が残りの日のために学ぶために必要なことだと思います)。 – Elie