更改我的 SQL Server 表中的 ID,使它们成为一个序列



我有一个表,其中包含唯一的自动增量主键。某些条目已从表中删除,因此 id 中存在间隙,它不是一个序列。

我需要一个查询来使其成为一个序列。 该表未与任何其他表连接,因此我可以暂时从 id 列中删除 pk 并自动递增(直到 id 成为一个序列)。

  1. 我使用 SQL 服务器
  2. 如果可能,我想从特定 id 开始运行查询

您无法更新标识列值,也不能从列中删除标识、更新值并将其重新设置。您必须创建一个具有相同架构的新表,从旧表中复制数据,但对于 ID 生成一个新值,删除旧表并重命名新表以保留相同的名称。

use [tempdb]
go
if OBJECT_ID('TestTable') is not null
    drop table TestTable
go
create table TestTable (
    ID int not null primary key clustered identity(1,1)
    , Name varchar(50)
)
insert into TestTable(Name) values
    ('Row #1'),('Row #2'),('Row #3'),
    ('Row #4'),('Row #5'),('Row #6'),
    ('Row #7'),('Row #8'),('Row #9')
delete from TestTable where ID in (3, 4, 8) -- Make some gaps
create table TestTable_NEW (
    ID int not null primary key clustered identity(1,1)
    , Name varchar(50)
)
insert into TestTable_NEW(Name)
select Name
from TestTable
order by ID -- Preserve the rows order
drop table TestTable
exec sp_rename N'TestTable_NEW', N'TestTable'

但是,我根本不建议这样做。标识值应该是不可变的。它们永远不应该改变。如果您有间隙问题,则不允许删除现有记录。此外,标识不能保证序列中没有间隙。只是这些值将是唯一的并且不断增加。因此,您绝对应该重新考虑您的数据库和/或应用程序设计,因为它是有缺陷的。

相关内容

最新更新