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

ale*_*lex 109 mysql sql mysql-error-1064 sql-delete

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

DELETE FROM `pets` p,
            `pets_activities` pa
      WHERE p.`order` > :order
        AND p.`pet_id` = :pet_id
        AND pa.`id` = p.`pet_id`
Run Code Online (Sandbox Code Playgroud)

但是,我收到了这个错误

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

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

我究竟做错了什么?

小智 194

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
Run Code Online (Sandbox Code Playgroud)

或者你可以使用......

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
Run Code Online (Sandbox Code Playgroud)

...仅从pets_activities中删除

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

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

  • 我尝试了这个"删除所有1个查询"加入6个大表(每个人大约约15k行),查询花了155秒删除6个表中的63行:O (6认同)
  • 您也可以使用LEFT JOIN,如果第二个表没有匹配的条目,这将非常有用,否则不会删除任何内容. (4认同)
  • @techouse,您加入并过滤指数吗?15k x 15k x 15k x 15k 15k x 15k是1100万."SELECT"的长度类似吗? (2认同)

pax*_*blo 19

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

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

然后您的查询变得简单:

delete from `pets`
    where `order` > :order
      and `pet_id` = :pet_id
Run Code Online (Sandbox Code Playgroud)

  • 好吧,你们有自己的想法,但似乎你正在贬低DBMS的许多力量.级联删除与触发器,存储过程或约束一样,都是数据管理的一部分,如果您不知道自己在做什么,它们只会是危险的.不过,我不会进一步论证这一点,我们只能同意不同意. (14认同)
  • 埃里克,现在你引起了我的兴趣.如何在没有约束的情况下确保数据库中的数据完整性? (8认同)
  • @Erick说,"我也不使用触发器,存储过程或约束." 啊,你用Excel.:-) (4认同)
  • 我只是想跟进这个.在这种情况下,我已经改变了删除级联的立场.我一直是使用它们的新SQL环境的一部分,并且很好地使用它们并且它们非常有条理.在这个系统中,我们有利于将这些级联安装到位.它当然可以防止孤立的数据并且没有危险.问题是每个使用数据库的人都需要了解如何安全地使用它们.但是,当初级开发人员无人监督地进行数据库更改时,总会存在风险. (4认同)
  • @Erick,如果你已经设置了参照完整性,级联删除不会比删除更麻烦.我们已经知道`pa`是`p`的正确子项,因为`id/pet_id`映射. (3认同)
  • 您_are_明确表示要删除它们.只是不在删除时.您没有明确表示您希望在插入时触发触发器,但这并不会使它们变得危险. (3认同)
  • 获取数据不是问题 - 在这种情况下,您必须重建不应被删除的数据,这是一个真正的麻烦.只有Oracle拥有Flashback,这是对其内联重构意外删除数据的数据库的时间补充.SQL Server有快照,但它远没有Flashback那么光滑.这就是为什么Erick,我自己以及我曾与之合作过的许多其他人都喜欢明确删除的原因.与SQL Server的情况一样,它也不总是一个cut'n'dried操作,或者过去没有. (3认同)
  • 它可能并不奇怪,但我也不使用触发器,存储过程或约束.我更喜欢将这种逻辑放在我的执行平台中,并使用我的数据库来存储和检索数据.但这并不意味着我不知道如何使用或理解这些功能. (2认同)

RN *_*aha 13

用这个

DELETE FROM `articles`, `comments` 
USING `articles`,`comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
Run Code Online (Sandbox Code Playgroud)

要么

DELETE `articles`, `comments` 
FROM `articles`, `comments` 
WHERE `comments`.`article_id` = `articles`.`id` AND `articles`.`id` = 4
Run Code Online (Sandbox Code Playgroud)