首页 > 解决方案 > 仅当不同的许多列时才更新 SQL

问题描述

只有在字段不相等时才更新字段的讨论

如果不同,请参阅更新

我想实现类似于

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)

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

标签: sqlsql-update

解决方案


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

通常,数据库更新记录而不是。也就是说,将整条记录读入内存,更改值,然后将整条记录写回存储器。这是一种过度简化——页面缓存中有锁、日志记录和脏页——但它抓住了所发生事情的本质。

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

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

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

但是,一般来说,确保某些列已更改的方法很好。


推荐阅读