Mysql -用一个查询从多个表中删除[重复]

3mpgtkmj  于 2023-10-15  发布在  Mysql
关注(0)|答案(9)|浏览(119)

此问题已在此处有答案

How to delete from multiple tables in MySQL?(7个回答)
六年前就关门了。
我有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';";
5m1hhzi4

5m1hhzi41#

显然,这是可能的。关于manual
您可以在一个WHERE语句中指定多个表,以便根据WHERE子句中的特定条件从一个或多个表中删除行。但是,不能在多表对象中使用ORDER BY或LIMIT。table_references子句列出连接中涉及的表。它的语法在www.example.com节“JOIN连接”中描述12.2.8.1。
手册中的示例为:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

应适用1:1。

bxfogqkk

bxfogqkk2#

您可以使用ON DELETE CASCADE选项在表上定义外键约束。
然后从父表中删除记录将从子表中删除记录。
查看此链接:https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

bihw5rsg

bihw5rsg3#

您还可以使用以下查询:
DELETE FROM Student, Enrollment USING Student INNER JOIN Enrollment ON Student.studentId = Enrollment.studentId WHERE Student.studentId= 51;

2w2cym1i

2w2cym1i4#

在这种情况下,连接语句过于复杂。最初的问题只涉及同时从多个表中删除给定用户的记录。直觉上,你可能会期望这样的工作:

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

当然不是但是,与其编写多个语句(冗余且低效),使用连接(对新手来说很难)或外键(对新手来说更难,并且在所有引擎或现有数据集中都不可用),您可以使用 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);
}

希望这对某人有帮助!

bvjxkvbb

bvjxkvbb5#

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

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

gjmwrych6#

可以使用以下查询从多个表中删除行,
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

2o7dmzc5

2o7dmzc57#

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]
g0czyy6m

g0czyy6m8#

通常,你不能一次从多个表中删除,除非你使用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

rjjhvcjd

rjjhvcjd9#

通常,我希望这是一个触发器中强制执行的“级联删除”,你只需要删除主记录,然后所有的depepndent记录都会被触发器逻辑删除。
这个逻辑跟你写的差不多。

相关问题