Mysql - 使用一个查询从多个表中删除

Jas*_*son 37 mysql

我有4个表,用于存储每个用户的不同信息.每个表都有一个带有user_id的字段,用于标识哪一行属于哪个用户.如果我想删除用户,这是从多个表中删除该用户信息的最佳方法吗?我的目标是在一个查询中完成.

查询:

"DELETE FROM table1 WHERE user_id='$user_id';
DELETE FROM table2 WHERE user_id='$user_id';
DELETE FROM table3 WHERE user_id='$user_id';
DELETE FROM table4 WHERE user_id='$user_id';";
Run Code Online (Sandbox Code Playgroud)

Pek*_*ica 51

显然,这是可能的.从手册:

您可以在DELETE语句中指定多个表,以根据WHERE子句中的特定条件从一个或多个表中删除行.但是,您不能在多表DELETE中使用ORDER BY或LIMIT.table_references子句列出了连接中涉及的表.其语法在第12.2.8.1节"JOIN语法"中描述.

手册中的示例是:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;
Run Code Online (Sandbox Code Playgroud)

应适用1:1.

  • 在这里遇到一个问题(并且使用Rodel的答案)..如果所有表中都不存在相同的**user_id**,则删除没有**的行,而在问题中,这些查询将删除所有特定用户的所有表中的行. (3认同)
  • 显式连接语法是:`DELETE t1, t2 FROM t1 INNER JOIN t2 ON t1.id=t2.id INNER JOIN t3 ON t2.id=t3.id;` (2认同)

Cha*_*ndu 34

您可以使用ON DELETE CASCADE选项在表上定义外键约束.

然后从父表中删除记录将从子表中删除记录.

请访问此链接:http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

  • +1这是做到这一点的方法.即使这没有回答被问到的问题,它正在回答应该问的问题,这是如何在从表中删除记录时保持数据完整性. (5认同)
  • 如果你没有删除主记录(即在一些内容表中保存数据,但通过删除多个多对多关系表中的所有引用来重置其映射 - 我的特定用例),它也没那么有用. (4认同)
  • 它没有提到外键仅适用于某些存储引擎,并没有回答这个问题. (2认同)

Rod*_*ate 34

您还可以使用以下查询:

DELETE FROM Student, Enrollment USING Student INNER JOIN Enrollment ON Student.studentId = Enrollment.studentId WHERE Student.studentId= 51;


Jos*_*shR 15

在这种情况下,连接语句不必要地复杂化.原始问题仅涉及同时从多个表中删除给定用户的记录.直觉上,你可能会期望这样的东西起作用:

DELETE FROM table1,table2,table3,table4 WHERE user_id='$user_id'
Run Code Online (Sandbox Code Playgroud)

当然,它没有.但是,不是编写多个语句(冗余和低效),使用连接(对于初学者来说很难)或外键(对于新手来说更难以及在所有引擎或现有数据集中都不可用),您可以使用LOOP简化代码!

作为使用PHP的基本示例(其中$ db是您的连接句柄):

$tables = array("table1","table2","table3","table4");
foreach($tables as $table) {
  $query = "DELETE FROM $table WHERE user_id='$user_id'";
  mysqli_query($db,$query);
}
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人!

  • 没错,但我只是用PHP来说明方法.同样可以用其他语言实现. (3认同)
  • 虽然可能是一个很好的解决方案,但原始帖子没有提及或标记 PHP。 (2认同)

Abh*_*rde 6

您可以使用以下查询从多个表中删除行,

DELETE table1, table2, table3 FROM table1 INNER JOIN table2 INNER JOIN table3 WHERE table1.userid = table2.userid AND table2.userid = table3.userid AND table1.userid=3


小智 6

从两个带外键的表中你可以试试这个查询:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition
Run Code Online (Sandbox Code Playgroud)


Lig*_*ica 5

DELETE 的文档告诉您多表语法。

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]
Run Code Online (Sandbox Code Playgroud)

或者:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]
Run Code Online (Sandbox Code Playgroud)

  • @Sajad:有一个指向文档的链接,从我答案的第二个词开始。单击它,然后_阅读_。 (2认同)