Обновление столбца дважды в одном запросе - PullRequest
1 голос
/ 03 ноября 2011

Я хочу знать, что будет делать этот запрос:

UPDATE users SET
PaymentAmount = PaymentAmount + TempPaymentAmount,
PaymentDuration = PaymentDuration + TempPaymentDuration,
TempPaymentAmount = NULL,
TempPaymentDuration = NULL
WHERE UserID = 1234

Вы заметите, что я пытаюсь скопировать значение из временного столбца в исходный столбец и одновременно обнулить его. Мне интересно, будет ли запрос делать то, что я ожидаю.

Ответы [ 4 ]

2 голосов
/ 03 ноября 2011

Например, значения в строке (UserId = 1234) следующие:

PaymentAmount = 10
PaymentDuration = 30 
TempPaymentDuration = 40
TempPaymentAmount = 50

После выполнения запроса:

PaymentAmount = PaymentAmount + TempPaymentAmount = 60
PaymentDuration = PaymentDuration + TempPaymentDuration = 70
TempPaymentAmount = NULL
TempPaymentDuration = NULL 

MySQL 12.2.10. ОБНОВЛЕНИЕ Синтаксис

Если вы обращаетесь к столбцу из таблицы, который нужно обновить в выражении, UPDATE использует текущее значение столбца. Например, следующий оператор устанавливает col1 на единицу больше, чем его текущее значение:

UPDATE t1 SET col1 = col1 + 1;

Также точка интереса:

Второе назначение в следующем операторе устанавливает col2 в текущее (обновленное) значение col1, а не исходное значение col1. Результат является то, что col1 и col2 имеют одинаковое значение. Это поведение отличается от стандартный SQL.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;
1 голос
/ 03 ноября 2011

Должно работать, согласно документам (http://dev.mysql.com/doc/refman/5.0/en/update.html):

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

Итак, если вы запустите его, он должен выполнить все SET запросы один за другим, сначала используя оригинальное значение, а затем обнуляя его.

0 голосов
/ 03 ноября 2011

Это должно сработать .. Мое понимание того, что происходит на самом деле: #

UPDATE users SET
:New.PaymentAmount = :Old.PaymentAmount + :Old.TempPaymentAmount,
:New.PaymentDuration = :Old.PaymentDuration + :Old.TempPaymentDuration,
:New.TempPaymentAmount = NULL,
:New.TempPaymentDuration = NULL
WHERE UserID = 1234
0 голосов
/ 03 ноября 2011

Почему бы вам не попробовать и не выполнить его?

Ответ: да. Когда вы используете значения из столбцов, которые вы изменяете в том же запросе, ядро ​​базы данных будет принимать неизмененные значения при вычислении обновленных значений.

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