我正在使用这个查询: 删除T1、T2 从表 1 T1,表 2 T2
mysql 中工作似乎不一致。
如果两个表都包含行,则每个表中的所有行都会被删除,正如我所料。 但如果一个表已经为空,则另一张表将被忽略并且不会删除任何行。
这是正确的行为还是错误?
这是正确的行为。
对此进行测试以观察针对没有行的表的叉积连接返回空结果:
mysql> select * from table1, table2;
Empty set (0.00 sec)
如果要确保包含 table1 中的行,请使用外连接:
mysql> select * from table1 left join table2 on true;
+----+------+
| id | id |
+----+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
+----+------+
我使用 SELECT 只是为了演示返回非空结果。您可以使用与 DELETE 相同类型的联接,并查看它是否删除了行。
mysql> delete table1, table2 from table1 left join table2 on true;
Query OK, 3 rows affected (0.00 sec)
mysql> select * from table1;
Empty set (0.00 sec)
你可能会问如果table1没有行,而你想从table2中删除行怎么办?或者您不知道两个表是否没有行。那么你需要一个 FULL OUTER JOIN,但 MySQL 不支持这种类型的连接。
为什么不连续运行两个 DELETE 呢?如果您要删除所有行,那么在一个连接的 DELETE 语句中执行此操作没有任何好处。
DELETE FROM table1;
DELETE FROM table2;
如果需要将它们一起提交,请启动事务并在两次删除完成后提交。