【发布时间】: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;
因此,如果图像或项目被删除,数据库也会删除交叉引用。
看了很多网上的资源,还有stackoverflow,经常提示做自己想做的应该没问题 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:发布作为您自己问题的答案 - 它可能会在未来帮助其他人。
标签: mysql database-design foreign-keys mysql-workbench