如何从MySQL中的多个表中删除?
我试图从一些表中删除一次。 我做了一些研究,并提出了这个问题
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'附近使用正确的语法…
我从来没有做过交叉表删除,所以我没有经验,现在坚持!
我究竟做错了什么?
在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_activities中删除
请参阅http://dev.mysql.com/doc/refman/5.0/en/delete.html
对于单表删除,但是具有参照完整性,还有其他方法可以处理EXISTS,NOT EXISTS,IN,NOT IN等等。但是,上面指定从FROM子句之前用别名删除哪些表可以获得你更轻松地出了几个相当紧张的地方。 我倾向于在99%的情况下接触到EXISTS,然后在这个MySQL语法所需要的时间里有1%。
由于这似乎是pets
和pets_activities
之间的简单的父/子关系,因此使用删除级联创build外键约束会更好。
这样,当pets
行被删除时,与它相关的pets_activities
行也被自动删除。
然后你的查询变成一个简单的:
delete from `pets` where `order` > :order and `pet_id` = :pet_id
用这个
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
我目前没有mysql数据库进行testing,但是您是否尝试过在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。
语法看起来是正确的…尝试将其更改为使用INNER JOIN …
看看这个: http : //www.electrictoolbox.com/article/mysql/cross-table-delete/
对于任何人在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
通常,要从多个表中删除行,我遵循的语法如下所示。 解决scheme基于两个表之间存在某种关系的假设。
DELETE table1, table2 FROM table1 inner join table2 on table2.id = table1.id WHERE [conditions]