Является ли mysql обновленным для таблицы соединений? - PullRequest
1 голос
/ 25 мая 2019

У меня есть две таблицы t1 и t2 с первичным ключом id и целым числом amount каждая.Мне нужно «переместить» суммы с t2 на t1, но не потерять ни одной суммы и не получить лишних.Возможно ли это при однократном обновлении с автоматическим подтверждением и без изоляции транзакций?

Я имею в виду что-то вроде этого:

update t1 join t2 using (id)
    set t1.amount = t1.amount + t2.amount, t2.amount = 0;

Гарантируется ли, что это утверждение не изменит общую сумму?Или возможно (если изменить t2.amount во время этого выполнения или прервать его), что t1.amount увеличится не на то же значение, что t2.amount уменьшится?

1 Ответ

0 голосов
/ 25 мая 2019

Несмотря на то, что он работает должным образом, он задокументирован как «ненадежный»:

Назначения UPDATE для одной таблицы обычно оцениваются слева направо право. Для обновлений с несколькими таблицами нет гарантии, что назначения выполняются в любом конкретном порядке.

( Справочное руководство по MySQL 8.0 / ... / Синтаксис ОБНОВЛЕНИЯ )

Но вы можете вычислить сумму в производной таблице:

update t1
join t2 using (id)
join (
  select id, t1.amount + t2.amount as amount
  from t1 join t2 using(id)
) x using (id)
set t1.amount = x.amount,
    t2.amount = 0

В этом случае порядок в предложении SET не имеет значения, поскольку назначения не мешают.

Для InnoDB один оператор UPDATE является атомарным. Он либо выполнен полностью, либо не выполнен вообще. Если что-то пойдет не так во время выполнения (например, сбой сервера или переполнение типа данных), все изменения будут отменены или просто не зафиксированы.

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