sql - 仅当不同的许多列时才更新 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 个值,则速度会更快。
解决方案
你的方法很好。我会使用<>
而不是!=
,因为它是 SQL 中传统的不等式运算符。您可能想要检查NULL
值 - 但这似乎不是这个问题的问题。
通常,数据库更新记录而不是列。也就是说,将整条记录读入内存,更改值,然后将整条记录写回存储器。这是一种过度简化——页面缓存中有锁、日志记录和脏页——但它抓住了所发生事情的本质。
的开销update
通常在写入、锁定和日志记录方面。这与更新哪些字段无关。
这也有例外。例如,如果您使用的是列存储数据库,则每列都是单独存储的。在这种情况下,最好对每一列进行单独更新。
同样,如果某些值特别大,它们可能会“离页”存储。这可能会影响更新性能。
但是,一般来说,确保某些列已更改的方法很好。
推荐阅读
- javascript - React 将多级表导出到 CSV 文件
- ruby-on-rails - 即使`docker-compose run`命令失败,是否有可能返回true?
- python - 在条带结帐会话中传递产品 ID
- reactjs - 如何在 SPFx 1.10 中将 Web 部件的宽度填充为全屏宽度?
- c++ - OpenCL中逐行矩阵运算的实现
- node.js - 错误:连接 ECONNREFUSED 127.0.0.1:5432 heroku
- javascript - Strapi JWT 令牌生命周期?
- c# - JArray 中 JArray 的 OrderByDescending
- javascript - AWS S3 - 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法
- java - 我希望能够在 Anylogic 中 sleep()