Многостоловое обновление (MySQL) - PullRequest
2 голосов
/ 05 октября 2009

У меня вопрос по поводу многостолового обновления (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)?

Я обнаружил, что если бы я написал «ОБНОВЛЕНИЕ t1, t2», то обновился бы только t1, но при изменении оператора на «ОБНОВЛЕНИЕ t2, t1» все работало правильно.

Ответы [ 2 ]

2 голосов
/ 05 октября 2009

Прежде всего, всегда желательно, чтобы ваши JOINы были явными. И во-вторых, я думаю, что ваше состояние имеет опечатку и должно быть 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) .

0 голосов
/ 05 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...