2013-11-12 3 views
0

я следующие запросыКак выполнить два DELETE запросов один за другим

  1. DELETE FROM A WHERE Id IN (SELECT Id FROM B)
  2. DELETE FROM B

Я хочу убедитесь, что первый оператор завершен до того, как выполняется вторая, так как 1) зависит от 2)

Я хочу знать, выполняю ли эти запросы так, как это происходит, SQL заботится о завершении первая транзакция перед началом второй? Или есть способ, которым я могу убедиться, что вторая транзакция начинается только после завершения первого?

Любая помощь будет оценена

ответ

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 и практически любой тузда библиотекой (например, один с PHP).

+0

полуточка - это терминатор утверждения. Он не выполняет «цепочку» команд. –

+0

Не все клиентские интерфейсы поддерживают такой запрос. –

1

Если операторы находятся в одной и той же партии, это гарантировано.

Но вы можете обернуть их в транзакцию, чтобы гарантировать, что либо произойдет, либо не произойдет (откат).

+0

Будет ли downvoter, пожалуйста, объяснять ... –

1

Чтобы ответить на ваш вопрос, MySQL выполняет только один оператор за раз в данном сеансе. Таким образом, второй способ не может начаться до того, как первый закончен (если вы выполните их в том же потоке).

Я предлагаю другую альтернативу: Как насчет использования multi-table DELETE из обеих таблиц в одном выражении?

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

тип соединения я использую выше означает, что все строки из B будут удалены, а также в строки А, которые имеют соответствующие значения идентификаторов, если таковые имеются.

1

Вы можете разместить операторы delete внутри блока транзакции/try catch. Если один оператор удаления обнаруживает ошибку, вы можете «отменить» состояние своей базы данных до начала транзакции. Вот пример.

BEGIN TRY 
BEGIN TRANSACTION 
    --Your sequence of SQL statements here 
END TRY 
BEGIN CATCH 
     ROLLBACK TRANSACTION 
END CATCH 
Смежные вопросы