Многостоловое обновление (MySQL)

У меня есть вопрос, касающийся многостолового обновления (MySQL). Рассмотрим таблицы t1 и t2. PKEY для t1 - это 'tid', который является внешним ключом в t2. В t2 есть поле "qtyt2", которое зависит от поля "qtyt1" в таблице t1. Рассмотрим следующий оператор SQL:

UPDATE t2,t1
   SET t2.qtyt2=IF(( t2.qtyt2- t1.qtyt1 )<0,0,( t2.qtyt2- t1.qtyt1 ) ),
       t1.qtyt1 ="Some value.."
 WHERE t2.tid="some value.."
   AND t2.tid=t1.tid

В этом примере qtyt2 зависит от qtyt1 для обновления, а последний обновляется. Теперь результат должен возвращать 2, если две строки обновлены.

Есть ли гарантия, что поля будут обновлены в том порядке, в котором они появляются в операторе (сначала будет установлен qtyt2, а затем qtyt1)?

Возможно ли, что сначала будет установлен qtyt1, а затем qtyt2?

Важен ли порядок таблиц в операторе (UPDATE t2, t1 или UPDATE t1,t2)?

Я обнаружил, что если бы я написал "UPDATE t1,t2", то обновился бы только t1, но при изменении оператора на "UPDATE t2,t1" все работало правильно.

2 ответа

Во-первых, всегда желательно сделать ваши СОЕДИНЕНИЯ явными. И второе, я думаю, что ваше состояние имеет опечатку и должно быть WHERE t2.qtyt2='Some value..', Так:

UPDATE t2 JOIN t1 ON (t2.tid=t1.tid)
SET t2.qtyt2= IF(( t2.qtyt2- t1.qtyt1 )<0, 0,( t2.qtyt2- t1.qtyt1 ) ), 
    t1.qtyt1 ="Some value.." 
WHERE t2.qtyt2="Some value..";

Если это то, что вы имеете в виду, то я считаю, что должно произойти, что SQL найдет строку, где t2.qtyt2="Some value.."затем он обновит t2.qtyt2, а затем установит все t1.qtyt1 (в наборе строк) на "Some value.." (а не новое значение t2.qtyt2).

Я не верю, что MySQL гарантирует что-либо о порядке обновления. В любом случае это может иметь значение только при использовании таблиц InnoDB с ограничениями внешнего ключа, и в документации конкретно говорится, что порядок не гарантирован и в результате может произойти сбой обновления. В этом случае вы должны использовать отдельные операторы обновления, что не должно быть проблемой из-за изоляции транзакций, которые вы получаете с InnoDB.

Другие вопросы по тегам