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

Posted

技术标签:

【中文标题】在交叉引用表中创建具有两个外键的 MySQL 表【英文标题】:Creating a MySQL table with two foreign keys in a cross-reference table 【发布时间】:2012-05-17 17:36:24 【问题描述】:

这可能是由于缺乏知识或愚蠢,但我想了解如何在交叉引用表中创建外键:

比如我有两张表,item和image

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;

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

看了很多网上的资源,还有***,经常提示做自己想做的应该没问题 Defining multiple foreign keys in one table to many tables

但是 mysql 给了我这个一般错误

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

我需要一些帮助来了解 MySQL 到底在抱怨什么。

编辑:

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

MySQL 版本:5.5.16

【问题讨论】:

其实,我只是执行了这些语句,而且效果很好…… 它在 sqlfiddle 中工作:sqlfiddle.com/#!2/7cc08/1 @Yuri: pastebin.com/twrVUZVe - 你用的是什么版本的 MySQL? @Konerak 由于您的 pastebin 和 gordatron 的 sqlfiddle,我发现了错误,Nanne 让我意识到问题的根源。我在图像表之前创建了 item_image 表......总是像这样愚蠢的东西让我着迷。让我们看看我是不是唯一一个。 @YuriKolovsky:发布作为您自己问题的答案 - 它可能会在未来帮助其他人。 【参考方案1】:

我在 image 表之前创建了 item_image 表,这导致我得到 MySQL 错误 150

我现在觉得自己很傻:)

错误也可能是其他原因造成的,此时应检查

MySQL Creating tables with Foreign Keys giving errno: 150

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

【讨论】:

除了您解决了问题之外,设计错误。它不是Many to Many的关系,而是1 to Many的关系(1个艺术。许多图像)。所以你不需要使用交叉引用表,你应该在image表中存储一个外键。 @Lucio 一些文章重用了其他文章的图片,所以设计没有错。

以上是关于在交叉引用表中创建具有两个外键的 MySQL 表的主要内容,如果未能解决你的问题,请参考以下文章

sql中创建组合主键和组合外键

我从两个外键引用到两个不同的表中创建复合键时出错

mysql中添加外键问题,求高手

mysql外键仅引用复合主键的一部分

mysql外键

在mysql中创建两个用外键链接的表,插入、删除和更新