Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于Sql更新,是否有一个提示可用于不设置相同的值?_Sql - Fatal编程技术网

对于Sql更新,是否有一个提示可用于不设置相同的值?

对于Sql更新,是否有一个提示可用于不设置相同的值?,sql,Sql,如果我对一个非常大的表进行了以下Sql查询,这实际上仍然会使用新的(但相同的)值更新聚集索引: 我理解这是为什么,因为更新值(甚至更新到相同的值)可能会触发触发器,所以数据库需要遵守这一点 问题 但是,是否有一些提示可以告诉查询…“如果我传递的值与列相同,请继续” 上下文 我有一个定制的ORM建立在整洁的基础上。ORM很好,但目前在update语句中传递所有新值(它没有差异)。理想情况下,我可以写以下内容: UPDATE dbo.MyTable SET ColumnA = Case When @

如果我对一个非常大的表进行了以下Sql查询,这实际上仍然会使用新的(但相同的)值更新聚集索引:

我理解这是为什么,因为更新值(甚至更新到相同的值)可能会触发触发器,所以数据库需要遵守这一点

问题

但是,是否有一些提示可以告诉查询…“如果我传递的值与列相同,请继续”

上下文

我有一个定制的ORM建立在整洁的基础上。ORM很好,但目前在update语句中传递所有新值(它没有差异)。理想情况下,我可以写以下内容:

UPDATE dbo.MyTable
SET
ColumnA = Case When @columnA <> ColumnA Then @columnA Else ColumnA End,
ColumnB = Case When @columnB <> ColumnB Then @columnB Else ColumnB End
更新dbo.MyTable
设置
ColumnA=当@ColumnA ColumnA然后@ColumnA Else ColumnA End时的情况,
ColumnB=当@ColumnB ColumnB然后@ColumnB Else ColumnB End时的情况
并在不实际更改基础数据表的情况下获得所有性能改进。但问题是,将列设置为自身与将其设置为新值一样昂贵


此外,“where”子句在某些列可能更改而其他列可能不更改的情况下也不起作用。

使用mysql:它内置了这种行为mysql是否会在所有值都相同的情况下增加rowversion字段?我不确定是否可以避免使用where子句。如果它的形式是“WHERE A@A或B@B…”,那么它应该可以工作。另一种选择是添加另一个更新触发器。不过,我看不出他们两人的表现都很好。我不熟悉MERGE命令,但有人提到这可能很有用。MERGE命令对我来说是个好东西。我总是避免使用它,因为它看起来不必要的复杂,但是如果它处理了这种情况,它可能会工作。AFAIK mysql没有行版本号。它确实有一个数据类型
时间戳
,当您访问另一列时,它会自动更新,但即使执行更新,也不会更新,除非列值发生更改
UPDATE dbo.MyTable
SET
ColumnA = Case When @columnA <> ColumnA Then @columnA Else ColumnA End,
ColumnB = Case When @columnB <> ColumnB Then @columnB Else ColumnB End