2011-11-03 113 views
1

我想知道这个查询会做更新一列两次:在同一个查询

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

你会发现,我试图从临时列中的值复制到原始列并注销其与此同时。我想知道如果查询将做我所期望的。

+3

有没有什么理由不能运行它并找出答案? – Connell

+0

@Connell:活的数据库...坏主意。 –

+4

但是这种情况非常简单 - 在一个测试服务器上创建一个新表并尝试一下就没有问题了...... – Jan

回答

2

例如值列(用户ID = 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

如果您访问来自表中的列将被更新pression, UPDATE使用列的当前值。例如, 下面的语句设置COL1至一个比它的电流值更:

UPDATE t1 SET col1 = col1 + 1; 

另外一个interestign点:

在下面的语句集COL2第二分配到 当前(更新)col1值,而不是原始col1值。结果 是col1和col2具有相同的值。此行为与标准SQL 不同。

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

任何机会MySQL都会决定以相反的方式执行任何操作,比如先消失,稍后再添加? –

+0

为什么TempPaymentAmount = 20和TempPaymentAmount = 50? –

+0

@Salman A:即使行为会改变 - 只有在升级到新版本之前,您的行为才会受到影响。并且在每个版本升级之前,您总是应该阅读文档并在升级之前了解新版本的变化,以便您可以更新您的查询 – sll

0

你为什么不给它一个尝试和执行呢?

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

+0

上述答案另有说明:数据库将使用* updated *列值,而不是原始值。 –

+0

Ähm,你的答案是你的答案?所有的答案告诉你,原来的(或当前的)价值将被使用 - 而不是更新... – Jan

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 
1

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

单表的UPDATE赋值通常从左到右评估为 。对于多表更新,并不保证 指定按任何特定顺序执行。

所以,如果你运行它,它应该执行所有SET查询一个接一个,因此首先使用原始值,则抵消了。

+1

这是一般*这个词令我困惑。 –

+0

哈哈,你说得对,听起来不太自信。然而,这直接来自将它拼凑在一起的人,所以获得更多保证的唯一方法就是实际尝试它,我猜... – kasimir