如何一个接一个地执行两个DELETE查询

时间:2013-11-12 23:15:09

标签: mysql sql

我有以下查询

  1. 从一个地方删除(选择ID来自B)
  2. 从B中删除
  3. 我想确保第一个语句在执行第二个语句之前完成,因为1)依赖于2)

    我想知道我是否像这样执行这些查询,SQL是否会在开始第二个事务之前完成第一个事务? 或者有没有办法确保第二个交易只在第一个交易完成后开始?

    任何帮助将不胜感激

4 个答案:

答案 0 :(得分:1)

如果声明属于同一批次,则可以保证。

但您可能希望将它们包装在事务中以确保两者都发生或两者都不发生(回滚)。

答案 1 :(得分:1)

您可以通过用分号;分隔它们来连续执行查询。更多详情请见MySQL documentation

简单地说:

DELETE FROM A WHERE Id IN (SELECT Id FROM B); DELETE FROM B;

根据您的要求;这完全符合您的要求,基于以下示例:

mysql> select sleep(5); show databases;
+----------+
| sleep(5) |
+----------+
|        0 |
+----------+
1 row in set (5.00 sec)

+--------------------+
| Database           |
+--------------------+
|         ...        |
+--------------------+
9 rows in set (0.01 sec)

您可以使用mysql -e命令和几乎任何mysql库(例如带有php的库)来执行此操作。

答案 2 :(得分:1)

要回答您的问题,MySQL在给定会话中一次只执行一个语句。所以第二个语句在第一个语句完成之前无法启动(假设你在同一个线程中执行它们)。

我会提供另一种选择: 如何在一个语句中使用两个表中的多表DELETE?

DELETE A, B FROM A RIGHT OUTER JOIN B USING (id);

我上面使用的联接类型意味着将删除B中的所有行,以及A中具有匹配id值的行(如果有)。

答案 3 :(得分:1)

您可以将delete语句放在transaction / try catch块中。如果一个删除语句遇到错误,您可以"回滚"事务开始之前数据库的状态。这是一个例子。

BEGIN TRY
BEGIN TRANSACTION
    --Your sequence of SQL statements here
END TRY
BEGIN CATCH
        ROLLBACK TRANSACTION
END CATCH