仅当许多列不同时,SQL更新

时间:2018-09-30 13:52:42

标签: sql sql-update

有一个讨论仅在字段不相等时更新字段

请参阅UPDATE if different

我想实现类似于

UPDATE MyTable 
SET col1 = @newValue
WHERE Id = @Id AND col1 != @newValue

但是,如果表有20列,怎么办呢?

我应该对每一列重复上面的操作(这将限制对那些确实不同的字段的更新)。

或者最好做类似的事情

 UPDATE xx 
 SET col1 = Value1, 
     col2 = Value2, 
     col3 = Value3...
 WHERE id = ID 
   AND (col1 != Value1 OR col2 != Value2 OR col3 != Value3)

这将一次更新所有20列,即使只有一列有所不同。例如,如果需要更新5个值,则速度更快。

1 个答案:

答案 0 :(得分:2)

您的方法很好。我将使用<>而不是!=,因为它是SQL中的传统不等式运算符。您可能要检查NULL的值-但这似乎不是这个问题的问题。

通常,数据库更新记录而不是。即,将整个记录读入存储器,更改值,然后将整个记录写回存储。这是一个过分的简化-页面缓存中有锁,日志记录和脏页面-但它捕获了发生的事情的本质。

update的开销通常在写入,锁定和记录方面。这与更新哪些字段无关。

对此有一些例外。例如,如果您使用的是列存储数据库,则每个列将分别存储。在这种情况下,最好对每列进行单独更新。

同样,如果某些值特别大,则它们可能会“页外”存储。这可能会影响更新性能。

但是,通常来说,确保 some 列已更改的方法很好。