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';"; 

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

然后从父表中删除logging从子表中删除logging。

检查这个链接: http : //dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

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

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

您还可以使用以下查询:

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

join声明在这种情况下是不必要的复杂。 原来的问题只涉及从多个表中同时删除给定用户的logging。 直觉上,你可能会期望像这样的工作:

 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); } 

希望这可以帮助别人!

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

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

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] 

从两个表与外键你可以试试这个查询:

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

通常情况下,你不能一次从多个表中删除,除非你使用其他答案中显示的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%' 

然后pipe它(壳)到mysql命令执行。

例如,它会生成如下所示的内容:

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

更多面向壳体的例子是:

 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 – 删除/删除所有具有特定前缀的表 。

通常,我会期望这是一个“级联删除”在触发器中执行,您只需要删除主logging,然后所有depepndentlogging将被删除的触发器逻辑。

这个逻辑与你所写的相似。