首页 文章

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

提问于
浏览
97

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

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

但是,我收到了这个错误

Uncaught Database_Exception [1064]:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'p,pets_activities pa ...附近使用正确的语法

我以前从来没有做过十字表删除,所以我现在没经验并且卡住了!

我究竟做错了什么?

6 回答

  • 2

    Use a JOIN in the DELETE statement.

    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中删除

    http://dev.mysql.com/doc/refman/5.0/en/delete.html

    对于单表删除,但具有引用完整性,还有其他方法可以使用EXISTS,NOT EXISTS,IN,NOT IN等 . 但是上面的那个用于指定在FROM子句可以获取之前使用别名从哪些表中删除的表你更容易从一些非常紧张的地方出来 . 我倾向于在99%的情况下与EXISTS联系,然后这个MySQL语法占用了当天的1% .

  • 18

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

    这样,当删除 pets 行时,与其关联的 pets_activities 行也会自动删除 .

    然后您的查询变得简单:

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

    用这个

    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
    
  • 174

    语法看起来对我来说...尝试将其更改为使用INNER JOIN ...

    看看这个:http://www.electrictoolbox.com/article/mysql/cross-table-delete/

  • 2

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

  • 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]
    

相关问题