在交叉引用表中创建具有两个外键的 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 表的主要内容,如果未能解决你的问题,请参考以下文章