如何在 MySQL 中删除多个表?

我正试图同时从几个表中删除。我做了点研究,想出了这个

DELETE FROM `pets` p,
`pets_activities` pa
WHERE p.`order` > :order
AND p.`pet_id` = :pet_id
AND pa.`id` = p.`pet_id`

但是,我得到这个错误

未捕获的数据库异常[1064] : 您的 SQL 语法有一个错误; 请检查与您的 MySQL 服务器版本相对应的手册,以获得正确的语法使用接近‘ p,pets_activities pa..。

我从来没有做过跨表删除之前,所以我没有经验,现在卡住了!

我做错了什么?

236402 次浏览

在我看来语法是正确的... 尝试改变它使用 INNER JOIN..。

看看 这个

由于这似乎是 petspets_activities之间的一个简单的父/子关系,因此最好使用删除级联创建外键约束。

这样,当一个 pets行被删除时,与之相关联的 pets_activities行也会被自动删除。

那么你的问题就变得很简单了:

delete from `pets`
where `order` > :order
and `pet_id` = :pet_id

目前我还没有一个 mysql 数据库可以测试,但是您是否尝试过在 from 子句之前指定要删除的内容?例如:

DELETE p, pa FROM `pets` p,
`pets_activities` pa
WHERE p.`order` > :order
AND p.`pet_id` = :pet_id
AND pa.`id` = p.`pet_id`

我认为您使用的语法仅限于较新版本的 mysql。

DELETE语句中使用 JOIN

DELETE p, pa
FROM pets p
JOIN pets_activities pa ON pa.id = p.pet_id
WHERE p.order > :order
AND p.pet_id = :pet_id

或者你可以用..。

DELETE pa
FROM pets_activities pa
JOIN pets p ON pa.id = p.pet_id
WHERE p.order > :order
AND p.pet_id = :pet_id

只能从 pets_activities中删除

参见 这个

对于单个表的删除,但是对于参照完整性,还有其他方法来处理 EXISTSNOT EXISTSINNOT IN等等。但是上面那个在 FROM子句之前用别名指定要从哪些表中删除的子句可以让您更容易地摆脱一些相当棘手的问题。在99% 的情况下,我倾向于使用 EXISTS,然后有1% 的情况下使用这种 MySQL 语法。

用这个

DELETE FROM `articles`, `comments`
USING `articles`,`comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

或者

DELETE `articles`, `comments`
FROM `articles`, `comments`
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4

对于在2017年读到这篇文章的人来说,这就是我做类似事情的方式。

DELETE pets, pets_activities FROM pets inner join pets_activities
on pets_activities.id = pets.id WHERE pets.`order` > :order AND
pets.`pet_id` = :pet_id

通常,要从多个表中删除行,我遵循的语法如下所示。这个解决方案是基于这两个表之间存在某种关系的假设。

DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]

我发现这篇文章向您展示了如何使用 删除连接语句从多个表中删除数据,并给出了很好的解释。

enter image description here