2012-03-21 8 views
1

私はそうのように見えるのテーブルを持っている:MySQLのerrror:150

CREATE TABLE `countrytable` (
    `countryCode` varchar(2) NOT NULL DEFAULT '', 
    `currencyCode` varchar(3) NOT NULL, 
    `currencySymbol` varchar(4) NOT NULL DEFAULT '', 
    `currencyIsRight` tinyint(4) DEFAULT '0', 
    `currencyName` varchar(45) DEFAULT 'US Dollar', 
    `countryName` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`countryCode`,`currencyCode`), 
    UNIQUE KEY `countryCode_UNIQUE` (`countryCode`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

私はcountrytable.currencyCodeに外部キーを持つ別のテーブルを作成しようとしています。次のエラーが表示され続けます。

The specified relation was unable to be created. 
MySQL said: Can't create table 'noteitdb.#sql-b8_13' (errno: 150) 

2つの列のデータ型が完全に一致します。私は何が欠けていますか?

+0

右側のバーを参照してください。関連する見出しの下にあるその他の質問。 – Dev

+1

countrytable.currencyCodeはユニークではありません – Devart

+0

はい、ユニークではありませんが、私は 'countryCode'、' currencyCode'のペアで定義されたPKを持っています。 FKの定義は、参照列が一意であることを意味しますか?有効な値のセットから1つではありませんか? –

答えて

1
ALTER TABLE `countrytable` 
    DROP PRIMARY KEY, 
    ADD PRIMARY KEY (`currencyCode`, `countryCode`); 

currencyCodeを最初にインデックスに登録する必要があります。 MySQL docsを参照してください。

+0

Worked!本当にありがとう。私はまだ注文が関係する理由を理解しなければならない。 –

+0

これは良い解決策ではありません。あなたは 'currencyCode'だけにユニークキーを必要とします。複合キーではありません。 –

1

あなたがCurrencyCodeを参照する外部キー制約を持つようにしたい場合は、その後、あなたはUNIQUE(または主キー)この表では、この列の制約を必要とする:

ALTER TABLE countrytable 
    ADD UNIQUE KEY (currencyCode); 
0

はPK列からunsignedを削除します。

+1

これは解決策ではありませんが。私は私の外来キーを作成する前に、2つのINTフィールドの符号付き/符号なしと一致させる必要がある問題がありました。 –

+0

役立つ答え。署名付き/署名なしの間にも不一致がありました。ありがとう。 – Federico

関連する問題