在同一查询中两次更新列

时间:2011-11-03 10:30:11

标签: mysql sql

我想知道这个查询会做什么:

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

您会注意到我正在尝试将值从临时列复制到原始列并同时使其无效。我想知道查询是否会按照我的预期进行。

4 个答案:

答案 0 :(得分:2)

例如,行(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 Syntax

  

如果从表中访问要在表达式中更新的列,   UPDATE使用列的当前值。例如,   以下语句将col1设置为比其当前值多一个:

UPDATE t1 SET col1 = col1 + 1;

也是一个互动点:

  

以下语句中的第二个赋值将col2设置为   当前(更新)col1值,而不是原始col1值。结果   是col1和col2具有相同的值。这种行为不同于   标准SQL。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

答案 1 :(得分:1)

应该可行,根据文档(http://dev.mysql.com/doc/refman/5.0/en/update.html):

  

单表UPDATE分配通常从左到右进行评估   对。对于多表更新,无法保证   作业按任何特定顺序进行。

因此,如果你运行它,它应该逐个执行所有SET个查询,因此首先使用原始值,然后使其无效。

答案 2 :(得分:0)

为什么不试一试并执行它?

答案是肯定的:当您使用在同一查询中修改的列中的值时,数据库引擎将在计算更新值时采用未修改的值。

答案 3 :(得分:0)

它应该做..我对实际发生的事情的理解是:#

UPDATE users SET
:New.PaymentAmount = :Old.PaymentAmount + :Old.TempPaymentAmount,
:New.PaymentDuration = :Old.PaymentDuration + :Old.TempPaymentDuration,
:New.TempPaymentAmount = NULL,
:New.TempPaymentDuration = NULL
WHERE UserID = 1234