5

これはおそらく知識不足か単なる愚かさによるものですが、相互参照テーブルで外部キーを作成する方法を理解したいと思います。

たとえば、item と image の 2 つのテーブルがあります。

CREATE TABLE `item` (
    `id` INT(11) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    `name` VARCHAR(30) NOT NULL,
    `description` MEDIUMTEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `image` (
    `id` INT(11) UNSIGNED AUTO_INCREMENT,
    `file` VARCHAR(255) UNIQUE NOT NULL,
    `caption` VARCHAR(255),
    PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

任意の画像を任意のアイテムに参照したいので、次のような相互参照表を作成します。

CREATE TABLE `item_image` (
    `item` INT(11) UNSIGNED NOT NULL,#foreign key
    `img` INT(11) UNSIGNED NOT NULL,#foreign key
    PRIMARY KEY(`item`,`img`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

しかし、item_image テーブルには外部キーである列が含まれているので、このように制約しようとします。

CREATE TABLE `item_image` (
    `item` INT(11) UNSIGNED NOT NULL,
    `img` INT(11) UNSIGNED NOT NULL,
    PRIMARY KEY(`item`,`img`),
    FOREIGN KEY(`item`)
        REFERENCES `item` (`id`) 
        ON DELETE CASCADE,
    FOREIGN KEY(`img`)
        REFERENCES `image` (`id`) 
        ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

そのため、画像またはアイテムが削除された場合、データベースは相互参照も削除します。

私は Web と stackoverflow で多くのリソースを読みましたが、多くのテーブルに対して 1 つのテーブルで複数の外部キーを定義することで、やりたいことを実行するのに問題はないはずだとよく言われ ます。

しかし、MySQLは私にこの一般的なエラーを与えます

エラー コード: 1005。テーブル 'test.item_image' を作成できません (errno: 150)

MySQL が不平を言っていることを正確に理解するには、助けが必要です。

編集:

問題があれば、MySQL Workbench 5.2.39 CE でクエリを実行します...

MySQL バージョン: 5.5.16

4

1 に答える 1

3

item_imageテーブルの前にテーブルを作成しimageていたため、MySQL エラー 150 が発生しました。

私は今、愚かな気分です:)

エラーは他の理由によっても発生する可能性があります。その場合は確認する必要があります

MySQL errno を与える外部キーを使用してテーブルを作成する: 150

http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

于 2012-05-09T09:10:14.520 に答える