下面是创建我的表的脚本:
CREATE TABLE clients (
client_i INT(11),
PRIMARY KEY (client_id)
);
CREATE TABLE projects (
project_id INT(11) UNSIGNED,
client_id INT(11) UNSIGNED,
PRIMARY KEY (project_id)
);
CREATE TABLE posts (
post_id INT(11) UNSIGNED,
project_id INT(11) UNSIGNED,
PRIMARY KEY (post_id)
);
在我的PHP代码中,当删除客户端时,我想删除所有项目的帖子:
DELETE
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;
posts表没有外键client_id,只有project_id。我想删除具有传递client_id的项目中的帖子。
这是不工作的,因为没有帖子被删除。
由于您正在选择多个表,要删除的表不再是明确的。您需要选择:
DELETE posts FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id
在这种情况下,table_name1和table_name2是同一个表,所以这样可以工作:
DELETE projects FROM posts INNER JOIN [...]
你甚至可以删除这两个表,如果你想:
DELETE posts, projects FROM posts INNER JOIN [...]
注意,order by和limit不适用于多表删除。
还要注意,如果你为一个表声明了别名,那么在引用该表时必须使用别名:
DELETE p FROM posts as p INNER JOIN [...]
来自Carpetsmoker等的贡献。
mysql> INSERT INTO tb1 VALUES(1,1),(2,2),(3,3),(6,60),(7,70),(8,80);
mysql> INSERT INTO tb2 VALUES(1,1),(2,2),(3,3),(4,40),(5,50),(9,90);
从一个表中删除记录:
mysql> DELETE tb1 FROM tb1,tb2 WHERE tb1.id= tb2.id;
删除记录从两个表:
mysql> DELETE tb2,tb1 FROM tb2 JOIN tb1 USING(id);
MySQL使用JOIN删除记录
通常在SELECT语句中使用INNER JOIN从一个表中选择在其他表中有相应记录的记录。我们还可以使用INNER JOIN子句和DELETE语句从一个表中删除记录,以及其他表中相应的记录,例如,要从满足特定条件的T1和T2表中删除记录,您可以使用以下语句:
DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition
注意,您将表名T1和T2放在DELETE和FROM之间。如果省略T1表,DELETE语句只删除T2表中的记录,如果省略T2表,则只删除T1表中的记录。
连接条件T1。key = T2。key表示T2表中需要删除的对应记录。
WHERE子句中的条件指定需要删除T1和T2中的哪些记录。
单表删除:
为了从posts表中删除条目:
DELETE ps
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
为了从项目表中删除条目:
DELETE pj
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
为了从clients表中删除条目:
DELETE C
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;
多表删除:
为了从连接的结果中删除多个表的条目,你需要指定delete后的表名为逗号分隔的列表:
假设你想要删除一个特定客户端的所有三个表(posts,projects,clients)中的条目:
DELETE C,pj,ps
FROM clients C
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id