在交叉引用表中创建带有两个外键的MySQL表

Tim*_*nen 5 mysql database-design foreign-keys mysql-workbench

这可能来自一些缺乏知识或简单的愚蠢,但我想了解如何在交叉引用表中创建外键:

例如,我有两个表,项目和图像

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;
Run Code Online (Sandbox Code Playgroud)

我想将任何图像引用到任何项目,所以我创建一个这样的交叉引用表:

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;
Run Code Online (Sandbox Code Playgroud)

但是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;
Run Code Online (Sandbox Code Playgroud)

因此,如果图像或项目被删除,数据库也将删除交叉引用.

我已经在Web上阅读了很多资源和stackoverflow,并且经常建议在做我想要的事情时应该没有问题 将一个表中的多个外键定义为多个表

但MySQL给了我这个通用错误

错误代码:1005.无法创建表'test.item_image'(错误号:150)

我需要一些帮助来了解MySQL究竟在抱怨什么.

编辑:

如果重要,我在MySQL Workbench 5.2.39 CE中执行查询...

MySQL版本:5.5.16

Tim*_*nen 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/