如何从mysql的多个表中删除?

llmtgqce  于 2021-06-15  发布在  Mysql
关注(0)|答案(7)|浏览(382)

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

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 帕。。。
我从来没有做过跨表删除之前,所以我没有经验,并停留在现在!
我做错什么了?

rjzwgtxy

rjzwgtxy1#

对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]
dly7yett

dly7yett2#

我目前没有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。

xmq68pz9

xmq68pz93#

使用 JOINDELETE 声明。

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 , IN , NOT IN 等等,但在上面的一个表中,您可以在 FROM 从句可以让你更容易地摆脱一些相当棘手的问题。我倾向于接触一个 EXISTS 在99%的情况下,还有1%的情况下,这种mysql语法需要一天的时间。

qeeaahzv

qeeaahzv4#

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

alen0pnh

alen0pnh5#

用这个

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
mwecs4sa

mwecs4sa6#

语法在我看来是正确的。。。试着把它改成 INNER JOIN ...
看看这个。

ilmyapht

ilmyapht7#

因为这似乎是一个简单的父/子关系 pets 以及 pets_activities ,最好使用删除级联创建外键约束。
那样的话,当 pets 行被删除,则 pets_activities 与之关联的行也会自动删除。
然后,您的查询变得简单:

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

相关问题