Многостоловое обновление (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.