2011-08-01 23 views
0

予約と製品を参照するテーブルがありますが、外部キーを追加することはできません。ここでmySQLの外部キー

はテーブルです:

CREATE TABLE IF NOT EXISTS `resa_product` (
    `id_reservation` int(10) NOT NULL, 
    `id_business` int(10) NOT NULL, 
    `id_category` int(10) NOT NULL, 
    `id_product` int(10) NOT NULL, 
    `quantity` int(11) NOT NULL, 
    PRIMARY KEY (`id_reservation`,`id_business`,`id_category`,`id_product`), 
    KEY `resa_prod_index` (`id_business`,`id_category`,`id_product`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

製品テーブル:

CREATE TABLE IF NOT EXISTS `product` (
    `id_business` int(10) NOT NULL, 
    `id_product` int(10) NOT NULL AUTO_INCREMENT, 
    `id_category` int(10) NOT NULL, 
    `nom` varchar(32) COLLATE utf8_unicode_ci NOT NULL, 
... 
    PRIMARY KEY (`id_product`,`id_category`,`id_business`), 
    KEY `id_category` (`id_category`), 
    KEY `id_business` (`id_business`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; 

が、私はこれをしようとすると、私は、MySQLからエラー番号150を取得する:

ALTER TABLE `resa_product` 
ADD FOREIGN KEY (`id_business`, `id_category`, `id_product`) 
REFERENCES `product`(`id_business, `id_category`, `id_product`) 
ON UPDATE CASCADE 
ON DELETE RESTRICT; 

Iドン私はインデックスを追加しましたが、この合成キーを挿入できない理由を理解していません。誰かがアイデアを持っていますか?

+1

商品表はどのようなものですか? – gbn

+0

'product'テーブルはどのように見えますか? –

答えて

1

製品テーブルで3列の

  • データ・タイプと照合FK
と同じ順序で3列に一意制約またはインデックスが存在しなければならない
  • と一致する必要があります

    編集:質問の更新後。製品

    ALTER TABLE `resa_product` 
    ADD FOREIGN KEY (`id_product`, `id_category`, `id_business`) 
    REFERENCES `product`(`id_product, `id_category`, `id_business`) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT; 
    

    のPKに列の順序を整列させるため、これに

    変更外部キーただし、3列は、すべてのショーを超える異なる順序で表示されます。私はこれを個人的に一貫性のあるものにするつもりです...

  • +0

    ありがとう、私はそのインデックスが異なる列であることを理解できませんでしたので、列の順序が重要ではないと思いました。 –

    1

    最も一般的な理由は、この問題のためにあなたの助けのための

    おかげでproductsresa_product内の列の間のわずかな違いです。フィールドの型はまったく同じである必要があります。したがって、サイズ/精度と符号(符号なしまたは符号なし)はすべて一致する必要があります。