Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中删除多个表?_Mysql_Sql_Mysql Error 1064_Sql Delete - Fatal编程技术网

如何在MySQL中删除多个表?

如何在MySQL中删除多个表?,mysql,sql,mysql-error-1064,sql-delete,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` 然而,我得到了这个错误 未捕获数据库_异常[1064]:您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解在“p,

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

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\u活动”附近使用的正确语法

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


我做错了什么?

语法对我来说是正确的。。。尝试将其更改为使用
内部联接


看一看

由于这似乎是
pets
pets\u活动
之间的简单父/子关系,因此最好通过删除级联创建外键约束

这样,当删除
pets
行时,与之关联的
pets\u活动
行也会自动删除

然后,您的查询将变得简单:

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\u活动中删除

对于具有引用完整性的单表删除,还有其他方法可以使用
存在
不存在
中的
不是在
等中,而是在上面的一个例子中,在
from
子句之前用别名指定要从哪些表中删除,可以更轻松地摆脱一些非常棘手的问题。在99%的情况下,我倾向于找到一个
存在的
,然后在1%的情况下,这个MySQL语法占了一天的时间。

使用这个

DELETE FROM `articles`, `comments` 
USING `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]

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


@Erick,如果您已经设置了引用完整性,级联删除不会比单独删除带来更多麻烦。我们已经知道,
pa
p
的一个合适的孩子,因为
id/pet\u id
映射。好吧,你们有自己的想法,但看起来你们低估了DBMS的很多功能。级联删除与触发器、存储过程或约束一样是数据管理的一部分,只有在不知道自己在做什么的情况下,级联删除才是危险的。尽管如此,我不会进一步争论这一点,我们只能同意不同意。埃里克,现在你激起了我的兴趣。埃里克说:“我也不使用触发器、存储过程或约束。”啊,你使用Excel.:-)我只是想跟进这件事。在这种情况下,我已经改变了删除级联的立场。我是一个新的SQL环境的一部分,它使用了它们,并且使用得很好,而且它们非常有条理。在这个系统中,将这些级联安装到位对我们非常有利。它确实防止了孤立数据的出现,而且并不危险。问题是,使用数据库的每个人都需要了解如何安全地使用它们。但是,当初级开发人员在无人监督的情况下进行数据库更改时,总是存在风险。该查询执行成功,但没有删除任何行(但我相信它应该删除)。我尝试了这种“一次删除全部”查询,并连接了6个大表(每个表大约有15k行)查询用了155秒删除了6个表中的63行:O@cadman这是真正正确的答案;可能有人反对使用它,但它有时非常有用。我同意这是一个真正正确的答案,因为问题不是“你应该”而是“如何”。不过,我很想听听1%的情况,因为我想不出有哪种情况更适合这种情况。@techouse,你加入并过滤了索引吗?15k x 15k x 15k x 15k x 15k等于1100万。
SELECT
是否花费了同样长的时间?您也可以使用LEFT JOIN,如果第二个表没有匹配的条目,这将非常有用,否则将不会删除任何内容。遗憾的是,您没有包含实际的解决方案,因为链接是正确的!找到了一个很好的参考,可以在
DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id
WHERE [conditions]