如何在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]