UPDATE = DELETE(标记为)+ INSERT?

Gen*_*нин 11 sql database sql-server oracle

这是SQL Server问题,但我很欣赏其他DBMS上下文正确识别的答案.

Seth Lynch在MSDN论坛中回答我的问题的答案:

讲述:

"当数据更新时,它没有被覆盖 - 原始行被标记为已删除并且插入了新行"

这是正确的陈述吗?你能在文档中提供支持这方面的参考吗?
怎么验证?

相关讨论:

更新:不久前我认为READ UNCOMMITTED事务隔离级别允许脏读(或者,SQL Server中的相同内容,通过WITH(NOLOCK)提示)允许读取(来自其他事务)未提交(或者已提交,如果没有)但已改变)值但未部分改变(部分更新,部分删除或部分插入.

简而言之:简而言之,该短语通常是大多数情况下都是错误的(虽然它明确表示SQL Server中相当罕见的情况)

Dat*_*ter 9

根据Kalen Delaney的说法,她在"Microsoft SQL Server 2005内部:存储引擎"一书中写道,SQL Server 2005(现在是2008)可以通过使用插入/删除或就地更新一行,只需更改一列的值即可.以下是她在p上所说内容的快速摘要.这本书的第306-311页.

SQL Server 2005/2008中的正常行为是更新一行.该行保留在页面上的相同位置,仅更改受影响的字节.一个例子是更新整数列中的值,该值不是culstered索引的一部分.

当行的大小发生变化并且不再适合原始页面时,可以使用插入/删除更新行.当您更改varchar列中的值并使其更长时,可能会发生这种情况.当聚簇索引列发生更改并且行因其在索引中的位置而需要移动时也会发生这种情况(因为行按聚簇键排序).这方面的一个例子是在姓氏上带有聚簇索引的表中将某人的姓氏从"史密斯"改为"琼斯".