sql - SQL Server 删除 ID 列上的值
问题描述
在我的数据库中有一个列ID
设置为“自动增量”
因此,当我删除一行时,ID = 2
例如插入新行 ID 的值为 3。
问题是如何在删除操作中将 ID 返回 2 而不是 3?
我正在使用 Microsoft SQL Server 2012。
解决方案
与其他数据库中的大多数其他自动增量实现一样,SQL Server 的标识列不提供任何选项来“填补”在数字被浪费时留下的空白(这不仅可能发生在删除行时,也可能发生在事务滚动时返回或服务器重新启动时)。
这在文档中有明确规定:
列上的标识属性不保证以下内容:
[...]
值的重用- 对于具有特定种子/增量的给定身份属性,引擎不会重用身份值。
如果出于显示目的,您希望在删除行时重置一个不断增加的值,您可以row_number()
在select
查询中使用:
select t.*, row_number() over(order by id) new_id
from mytable t
如果您打算在常规基础上使用它,您可以创建一个视图,然后您可以查询而不是原始表:
create view myview as
select t.*, row_number() over(order by id) new_id
from mytable t;
select * from myview;
推荐阅读
- java - 如何使用具有多个 bean 定义的 Spring ObjectProvider
- java - 使用动态规划解决问题
- apache-kafka - 当我收到缺少所需参数“[topic]”的错误时,如何尝试阅读 kafka 中的主题
- postgresql - 如何在此查询中包含来自 case 语句的小于 where 语句?
- python - 高级字符串数据操作
- python - Nvidia Jetson 上的 Tensorflow Lite
- regex - 如何在 pyspark 中使用 regex_replace 将日期从 yyyymmdd 重新格式化为 yyyy/mm/dd 并将时间从 HHmmss 重新格式化为 HH:mm:ss
- python - 我可以通过自动生成的类实例来创建子弹系统吗?(游戏)
- c# - 当我使用“.Net Core”调用“SOAP 服务”时,我需要一个“BinarySecurityToken”
- javascript - 如何使用带有 json 数据的 jquery Ajax 将标签包装在 for 循环中?