2012-02-27 24 views
0

私は2つのテーブル、「PO」と「外部キーを定義することによって、私は2つのテーブルを接続しようとしているのMySQL:エラーメッセージは、テーブルを作成できません(エラー番号:150)

CREATE TABLE `po` (
    `PO_ID` bigint(20) NOT NULL, 
    `SERVICE_TYPE` bit(1) DEFAULT NULL, 
    `ENTRY_DATE` date NOT NULL, 
    `RECEIPT_DATE` date DEFAULT NULL, 
    `TURNOVER` date DEFAULT NULL, 
    `MOBILIZATION` date DEFAULT NULL, 
    `SITE_NAME` varchar(255) NOT NULL, 
    `SITE_CODE` varchar(45) DEFAULT NULL, 
    `SITE_TIN` varchar(45) DEFAULT NULL, 
    `SITE_ADDRESS` varchar(255) NOT NULL, 
    `COST` decimal(11,2) NOT NULL, 
    `XML` text, 
    PRIMARY KEY (`PO_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

CREATE TABLE `receive` (
    `RECEIPT_ID` varchar(100) NOT NULL, 
    `RECEIPT_DATE` date NOT NULL, 
    `PO_NUMBER` bigint(20) NOT NULL, 
    `SUPPLIER_ID` int(11) NOT NULL, 
    PRIMARY KEY (`RECEIPT_ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$ 

「を受け取る」を持っています」テーブルの 'fk_poは'

ALTER TABLE `fourthwave`.`receive` 
    ADD CONSTRAINT `fk_po` 
    FOREIGN KEY (`PO_NUMBER`) 
    REFERENCES `fourthwave`.`po` (`PO_ID`) 
    ON DELETE SET NULL 
    ON UPDATE SET NULL 
, ADD INDEX `fk_po` (`PO_NUMBER` ASC) 

を受け取るしかし、上記のALTERクエリがエラーをスローします:

Error Code: 1005. Can't create table 'fourthwave.#sql-aec_11' (errno:150) 

私はFiのため、このエラーを取得しています両方のテーブルの 'PO_ID'と 'PO_NUMBER'は異なっていますか?

答えて

3

ALTER TABLEの後にSHOW ENGINE INNODB STATUS文を実行すると、「 列の一部がNOT NULLとして定義されていますが、SET NULL条件を定義しました」というエラーメッセージが表示されます。

ALTER TABLE `receive` 
    ADD CONSTRAINT `fk_po` 
    FOREIGN KEY (`PO_NUMBER`) 
    REFERENCES `po` (`PO_ID`) 
    ON DELETE SET NULL 
    ON UPDATE SET NULL 
, ADD INDEX `fk_po` (`PO_NUMBER` ASC); 

SHOW ENGINE INNODB STATUS; 
+0

これは機能しましたか?同じ名前のインデックスとFK制約を設定できますか? –

+0

はい、動作します。別の名前を付けることもできますが、このインデックスを作成しないと、MySQLは同じ名前でそれを作成します。 – Devart

+0

興味深い。 FKを追加して制約の名前を省略すると、MySQLは常に自動的に 'some_table_ibfk_1'のようなものを入力します。これはインデックスとFKに関して名前の衝突がないことを保証するものです。 –

0

receiveテーブルにPO_NUMBERのインデックスが必要です。外部キーで参照しているフィールドは、常に索引付けする必要があります。

関連する問題