質問

MySQLバージョン5.1で、他の3つのテーブルを参照するテーブルを作成する次のスクリプトがあります。 3つのテーブルすべてがInnoDBを使用して作成されており、3つのテーブルすべてにINTとして定義されたID列があります。

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;

同様の問題を扱ったいくつかの質問を閲覧しましたが、ほとんどは定義の重複と不一致のフィールドタイプであり、一部のテーブルではInnoDBを使用していないようです。ただし、これらのいずれも問題ではないようです。アイデアはありますか?

役に立ちましたか?

解決

「SHOW ENGINE INNODB STATUS」コマンドはいつでも発行できます。出力には、「最新の外部キーエラー」が埋め込まれます。 「150」エラーの正確な原因に関する詳細が記載されているセクション:

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 ...]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top