125

我试图一次从几个表中删除。我做了一些研究,并想出了这个

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

但是,我收到此错误

未捕获的 Database_Exception [1064]:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'p, pets_activitiespa...附近使用的正确语法

我以前从未做过交叉表删除,所以我没有经验,现在卡住了!

我究竟做错了什么?

4

7 回答 7

228

JOINDELETE语句中使用 a 。

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

看到这个

对于单个表删除,但具有引用完整性,还有其他方法可以处理EXISTS, NOT EXISTS,INNOT IN。但是在上面的那个中,您在FROM子句之前使用别名指定要从哪些表中删除,可以让您摆脱一些非常紧张的情况更容易斑点。我倾向于接触EXISTS99% 的案例,然后有 1% 的案例需要这种 MySQL 语法。

于 2012-07-11T21:56:33.623 回答
21

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

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

然后你的查询就变得很简单:

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id
于 2010-07-26T03:17:56.560 回答
16

用这个

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
于 2015-02-20T05:08:33.517 回答
3

我目前没有要测试的 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。

于 2010-07-26T03:51:28.410 回答
2

语法对我来说是正确的...尝试将其更改为使用INNER JOIN...

看看这个

于 2010-07-26T03:13:41.657 回答
1

对于任何在 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]
于 2017-10-23T08:38:31.503 回答
1

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

在此处输入图像描述

于 2020-02-15T10:28:36.803 回答