这是创建表的脚本:
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
的项目中的帖子 .
现在这不起作用,因为没有删除任何帖子 .
13 回答
试试这个,
或者同样的事情,稍微不同(IMO友好)的语法:
顺便说一句,使用连接的mysql几乎总是比子查询更快...
MySQL使用JOIN删除记录
通常在SELECT语句中使用INNER JOIN从表中选择具有其他表中相应记录的记录 . 我们还可以使用带有DELETE语句的INNER JOIN子句来删除表中的记录以及其他表中的相应记录,例如,要删除满足特定条件的T1和T2表中的记录,请使用以下语句:
请注意,您将表名T1和T2放在DELETE和FROM之间 . 如果省略T1表,则DELETE语句仅删除T2表中的记录,如果省略T2表,则仅删除T1表中的记录 .
连接条件T1.key = T2.key指定T2表中需要删除的相应记录 .
WHERE子句中的条件指定需要删除T1和T2中的哪些记录 .
尝试如下:
Single Table Delete:
In order to delete entries from posts table:
In order to delete entries from projects table:
In order to delete entries from clients table:
Multiple Tables Delete:
要从连接结果中删除多个表中的条目,您需要在
DELETE
之后以逗号分隔列表指定表名:假设您要删除特定客户端的所有三个表(
posts
,projects
,clients
)中的条目:DELETE records FROM one table :
DELETE RECORDS FROM both tables:
我更习惯于子查询解决方案,但我还没有在MySQL中尝试过:
如果加入对您不起作用,您可以尝试此解决方案 . 它用于在不使用特定条件的外键时从t1删除孤立记录 . 即它删除table1中的记录,这些记录具有空字段“code”,并且在table2中没有记录,通过字段“name”进行匹配 .
由于您要选择多个表,因此要删除的表不再明确 . 您需要选择:
在这种情况下,
table_name1
和table_name2
是同一个表,所以这将工作:如果您想要,您甚至可以从两个表中删除:
请注意
order by
和limit
don't work for multi-table deletes .另请注意,如果声明表的别名,则在引用表时必须使用别名:
来自Carpetsmoker等的捐款
您也可以像这样使用ALIAS它只是在我的数据库中使用它! t是需要删除的表格!
您只需要指定要删除
posts
表中的条目:编辑:有关更多信息,请参阅this alternative answer
使用比使用
IN
更好的子选择删除的另一种方法是WHERE
EXISTS
使用此而不是连接的一个原因是
DELETE
与JOIN
禁止使用LIMIT
. 如果您希望在块中删除以便不生成完整的表锁,可以添加LIMIT
使用此DELETE WHERE EXISTS
方法 .