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

时间:2011-01-29 22:43:09

标签: 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';";

9 个答案:

答案 0 :(得分:51)

显然,这是可能的。来自manual

  

您可以在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;

应适用1:1。

答案 1 :(得分:34)

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

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

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

答案 2 :(得分:34)

您还可以使用以下查询:

  

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

答案 3 :(得分:13)

在这种情况下,连接语句不必要地复杂化。原始问题仅涉及同时从多个表中删除给定用户的记录。直观地说,您可能会期望这样的事情发挥作用:

DELETE FROM table1,table2,table3,table4 WHERE user_id='$user_id'

当然,它没有。但是,不是编写多个语句(冗余和低效),使用连接(对于初学者来说很难)或外键(对于新手来说更难以及在所有引擎或现有数据集中都不可用),您可以使用 <来简化代码EM> 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);
}

希望这有助于某人!

答案 4 :(得分:6)

从具有外键的两个表中

可以尝试此查询:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition

答案 5 :(得分:5)

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

  

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 :(得分:4)

documentation for DELETE告诉你多表语法。

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

或者:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

答案 7 :(得分:1)

通常情况下,您不能同时从多个表中删除,除非您使用其他答案中显示的JOIN。

但是如果你的所有表都以某个名称开头,那么这个查询将生成将执行该任务的查询:

SELECT CONCAT('DELETE FROM ', GROUP_CONCAT(TABLE_NAME SEPARATOR ' WHERE user_id=123;DELETE FROM ') , 'FROM table1;' ) AS statement FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%'

然后将它(在shell中)传递给mysql命令以便执行。

例如,它会生成如下内容:

DELETE FROM table1 WHERE user_id=123;
DELETE FROM table2 WHERE user_id=123;
DELETE FROM table3 WHERE user_id=123;

更多面向shell的例子是:

echo "SHOW TABLES LIKE 'table%'" | mysql | tail -n +2 | xargs -L1 -I% echo "DELETE FROM % WHERE user_id=123;" | mysql -v

如果您只想使用MySQL,您可以考虑更高级的查询,例如:

SET @TABLES = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_NAME LIKE 'table%');
PREPARE drop_statement FROM 'DELETE FROM @tables';
EXECUTE drop_statement USING @TABLES;
DEALLOCATE PREPARE drop_statement;

以上示例基于:MySQL – Delete/Drop all tables with specific prefix

答案 8 :(得分:0)

通常,我希望这是一个'级联删除' 在触发器中强制执行,您只需要删除主记录,然后触发器逻辑将删除所有的depepndent记录。

这种逻辑与你所写的类似。