mysql - 删除多对多关系中的正确内容

标签 mysql sql

我有一个关于多对多关系的简短问题。 这是我的表格:

+---------+----------------+
| 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_categorycategory_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/

相关文章:

mysql - 重新启动 MySQL 数据库和 Apache Web 服务器后无法获取

mysql - 一个月内可用预约空档的 SQL 查询

SQL 服务器 : combine maximum result and second largest results in single query

mysql - 获取每个 post_id 的最后结果

sql - 如何在SQL中选择 'previous'和 'next'记录?

php - 如果id在数组中,vuejs检查复选框

javascript - 如何在nodejs中先实现mysql查询? (或者先实现条件查询)

mysql - 如果表中的行数很大(200 万),NDB cluster7.5(MySQL 5.7)在获取数据时会花费更多时间

php - 如何从mysql表中获取数组的单个值并在搜索中使用

sql - 通过程序插入数据时遇到意外问题