sql - 重用已删除行的标识值
问题描述
在 SQL Server 2008 Express 中删除行后是否可以重用标识字段值?这是一个例子。假设我有一个以 Id 字段作为主键(身份)的表。如果我添加五行,我将有这 5 个 Id:1、2、3、4、5。如果我要删除这些行,然后再添加五行,新行将有 Id:6、7、8, 9, 10. 可以让它从 1 重新开始吗?
我是否必须从另一个表中删除数据才能完成此操作?谢谢你的帮助。
解决方案
在 SQL Server 2008 Express 中删除行后是否可以重用标识字段值?
是的,但这是您可能做出的最糟糕的决定之一。
这太糟糕了,我不会解释如何做到这一点,但只是为什么这很糟糕。
我们使用标识列来生成与表中包含的数据无关的值。
- 如果我们使用身份作为主键并重用它们的值,那么同一个键将在整个时间内保存 2 个(或更多)不同的实体,特别是在生成报告或拥有使用此键且没有引用的其他表时会造成混淆正直。
- 当行数增加时,用于识别未使用值(臭名昭著的间隙和孤岛问题)的解决方案非常缓慢。随着行的堆积,这会使性能下降。
- 每次在表上插入行时,您都必须应用此“未使用的数字”逻辑,因此在维护任务中要记住另一件事。
- 重用这些数字几乎没有好处,因为
INT
或者BIGINT
最大值足以支持大多数业务数据。 - 将身份用作主键或与聚集索引一起使用是很常见的,因为新记录将被插入到最后,从而减少了碎片。一旦记录被删除,它会在页面(瑞士奶酪页面)之间产生间隙,这可以通过重建索引来解决。问题出现在重建之后,您可能会在其中大量插入新记录并导致大量页面拆分,从而不必要地影响性能。
当您实际上需要填充标识列中的空白时,我无法想到一个真实的案例,因为此值的目的是与表所代表的实体无关。
推荐阅读
- sql - Oracle 18c - 左连接条件 USING 子句
- postgresql - 执行交叉表返回 n+ 元组时出错
- python - 如何在多核上的 jupyter notebook 中运行代码?
- asp.net-core - 访问网络摄像头 - .NET Core Web 应用程序
- heroku - 将 Mulesoft 连接到 Heroku 托管的 Kafka
- node.js - POST 和 Patch 在 POSTMAN 中无法使用 JSON 数据
- ssh - 如何在有或没有跳转主机的情况下运行相同的剧本和库存?
- javascript - Bazel 自动为 ts_library 生成依赖项
- python-3.x - Anaconda 无法在 Windows10 上创建进程
- python - 点击计数/页面查看功能 Django 应用程序