有一个讨论仅在字段不相等时更新字段
我想实现类似于
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个值,则速度更快。
答案 0 :(得分:2)
您的方法很好。我将使用<>
而不是!=
,因为它是SQL中的传统不等式运算符。您可能要检查NULL
的值-但这似乎不是这个问题的问题。
通常,数据库更新记录而不是列。即,将整个记录读入存储器,更改值,然后将整个记录写回存储。这是一个过分的简化-页面缓存中有锁,日志记录和脏页面-但它捕获了发生的事情的本质。
update
的开销通常在写入,锁定和记录方面。这与更新哪些字段无关。
对此有一些例外。例如,如果您使用的是列存储数据库,则每个列将分别存储。在这种情况下,最好对每列进行单独更新。
同样,如果某些值特别大,则它们可能会“页外”存储。这可能会影响更新性能。
但是,通常来说,确保 some 列已更改的方法很好。