简体   繁体   English

如何使用一个查询删除两个链接表中的数据(多对多关系)?

[英]How to delete data in two linked tables (many-to-many relationship) with one query?

There are tables films , actors and the table binding them films_actors . 有表filmsactors和表格绑定他们films_actors

CREATE code: 创建代码:

CREATE TABLE `actors` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(50) NOT NULL,
`surname` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=9
;

CREATE TABLE `films` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`release` SMALLINT(4) NOT NULL,
`format` VARCHAR(10) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=6
;
CREATE TABLE `films_actors` (
`id_film` INT(11) NOT NULL,
`id_actor` INT(11) NOT NULL,
INDEX `FK_films_actors_actors` (`id_actor`),
INDEX `FK_films_actors_films` (`id_film`),
CONSTRAINT `FK_films_actors_actors` FOREIGN KEY (`id_actor`) REFERENCES `actors` (`id`) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_films_actors_films` FOREIGN KEY (`id_film`) REFERENCES `films` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;

If I delete data from the tables actors or films , then the data will automatically be deleted from the films_actors table, the question is whether one query can delete data from all three tables at once? 如果我从表actorsfilms删除数据,那么数据将自动从films_actors表中删除,问题是一个查询是否可以一次删除所有三个表中的数据?

Here is the query that I tried to write, but without success. 这是我试图写的查询,但没有成功。

delete
from films, actors
where actors.id in (
select films_actors.id_actor from films_actors 
where films_actors.id_film = 5
) and films.id = films_actors.id_film

You could use an delete join and use a subquery in join for manage the IN clause 您可以使用删除联接并在联接中使用子查询来管理IN子句

    delete films.*, actors.*
from films
INNER JOIN (
    select films_actors.id_actor, id_film
    from films_actors 
    where films_actors.id_film = 5
)  t  ON films.id = t.id_film
INNER JOIN  actors ON actors.id = t.id_actor 

You should be able to do: 你应该能够做到:

delete f, a, fa
from films f join
     films_actors fa
     on fa.id_film = f.id join
     actors a
     on fa.id_actor = a.id
where f.id = 5;

This seems dangerous, because actors could be in other films. 这似乎很危险,因为演员可能在其他电影中。 I assume you only really want to delete from f and fa . 我假设你只想从ffa删除。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM