sql - UPDATE = DELETE(标记为) + INSERT吗?

标签 sql sql-server database oracle

这是 SQL Server 问题,但我希望能从正确识别的其他 DBMS 上下文中得到答案。

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

讲述:

"When data is updated it is not over written - the original row is marked as deleted and a new row is inserted"

这是正确的说法吗?你能在文档中提供支持这一点的引用吗?
如何验证?

相关讨论:

更新:不久前,我相信在 READ UNCOMMITTED 事务隔离级别(或者,通过 WITH(NOLOCK) 提示,在 SQL Server 中是相同的)允许读取(来自其他事务)未提交(或已提交) ,如果尚未更改)值但未部分更改(部分更新、部分删除或部分插入。

RESUME':简而言之,该短语通常在大多数情况下都是不正确的(虽然它明确说明了 SQL Server 中相当不常见的情况)

最佳答案

根据 Kalen Delaney 的说法,在她的Inside Microsoft SQL Server 2005: The Storage Engine一书中,SQL Server 2005(以及现在的 2008)可以通过使用插入/删除或就地更新行,只需更改一列的值。这是她在第 1 页上所说内容的简要总结。书的 306-311。

SQL Server 2005/2008 中的正常行为是就地更新行。该行保留在页面上的相同位置,并且仅更改受影响的字节。这方面的一个例子是更新不属于 cultered 索引的整数列中的值。

当行的大小发生变化并且不再适合原始页面时,行可能会通过插入/删除进行更新。当您更改 varchar 列中的值并使其更长时,可能会发生这种情况。当聚集索引列正在更改并且行由于其在索引中的位置而需要移动时也会发生这种情况(因为行按聚集键排序)。这方面的一个例子是在姓氏上有聚簇索引的表中将某人的姓氏从“Smith”更改为“Jones”。

关于sql - UPDATE = DELETE(标记为) + INSERT吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4291540/

相关文章:

php - 如何将带有php的下拉菜单的值传递给数据库

mysql - 如何在MySQL中添加选择时不存在的行

.net - 版本控制为 : optimal way of getting a list of last version using SQL 的实体

c# - 数据库是我的 C# 应用程序数据存储的正确选择吗?

mysql - 如何在 mysql 中的三个表的另一个子查询中使用子查询?

c - 从 CSV 读取数据并放入数据库

SQL - 调查数据,循环调查问题的表模式设计

sql - 如何解决 SQL Server 中的性能问题

sql - 简化 WHERE (NOT) IN (...) 和 WHERE (NOT) IN (...)

sql-server - 使用脚本更改 SQL Server 身份验证模式