【问题标题】:SQL update only if different many columns仅当不同的许多列时才更新 SQL
【发布时间】:2018-09-30 22:14:49
【问题描述】:

有一个讨论,只有当它不相等时才更新一个字段

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)

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

【问题讨论】:

  • 除了 Gordon 的回答之外,您可能还想查看 Slowly Changing Dimensions - Type 1 的实现并忽略其中的 INSERT 部分。 SCD1 中的更新工作方式与您想要的相同。并确保处理 NULL ,因为您无法将 NULLNULL 进行比较,这会给您带来意想不到的结果。

标签: sql sql-update


【解决方案1】:

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

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

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

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

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

但是,一般而言,您确保 some 列已更改的方法很好。

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多