这可能来自一些缺乏知识或简单的愚蠢,但我想了解如何在交叉引用表中创建外键:
例如,我有两个表,项目和图像
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
答案 0 :(得分:3)
我在item_image
表之前创建了image
表,这导致我得到MySQL错误150
我现在感到愚蠢:)
错误也可能由其他原因引起,在这种情况下你应该检查