我有一个关于多对多关系的简短问题。 这是我的表格:
+---------+----------------+
| film_id | title |
+---------+----------------+
| 1 | Apocalypse Now |
+---------+----------------+
+-------------+----------------------+
| category_id | name |
+-------------+----------------------+
| 1 | cool category |
+-------------+----------------------+
| 2 | not so cool category |
+-------------+----------------------+
+---------+-------------+
| film_id | category_id |
+---------+-------------+
| 1 | 1 |
+---------+-------------+
| 1 | 2 |
+---------+-------------+
正如您所看到的,film_category
表中有来自 film
表和 category
表的 FK。
我想要的:如果要删除category
,则删除 film_category
中 category_id
中的所有条目code> 出现也应该删除。但不是相关的电影
!除此之外:这应该在删除影片
时起作用,反之亦然! (这正是我的问题)
我的问题:我可以仅使用 FK 定义解决问题吗?还是必须先手动删除 film_category
表中的所有条目才能删除 电影
或类别
?
最佳答案
您的表格应如下所示。电影表中的删除应删除电影类别具有相同 id 的行,反之亦然。
CREATE TABLE `film` (
`film_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`film_id`)
) ENGINE=InnoDB;
CREATE TABLE `category` (
`category_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`category_id`)
) ENGINE=InnoDB;
CREATE TABLE `film_category` (
`film_category_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`film_id` int(10) unsigned NOT NULL DEFAULT '0',
`category_id` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`film_category_id`),
KEY `film_id` (`film_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `film_category_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`) ON DELETE CASCADE,
CONSTRAINT `film_category_ibfk_1` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON DELETE CASCADE
) ENGINE=InnoDB;
您还应该能够对 film_category 使用以下内容:
CREATE TABLE `film_category` (
`film_id` int(10) unsigned NOT NULL DEFAULT '0',
`category_id` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`film_id`,`category_id`),
CONSTRAINT `film_category_ibfk_1` FOREIGN KEY (`film_id`) REFERENCES `film` (`film_id`) ON DELETE CASCADE,
CONSTRAINT `film_category_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `category` (`category_id`) ON DELETE CASCADE
) ENGINE=InnoDB;
关于mysql - 删除多对多关系中的正确内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202389/