在sql server中重新排序Identity主键

Mon*_*RPG 7 sql-server identity primary-key

是的,我非常清楚后果.但我只是想重新排序它们.从1开始到结束.

如何使用单个查询重新排序密钥?

它是聚簇主键索引

像重新排序一样

First record Id 1 
second record Id 2
Run Code Online (Sandbox Code Playgroud)

主键是Int

Mar*_*ith 6

IDENTITY无论SET IDENTITY_INSERT选项如何,列都不可更新.

您可以使用与原始IDENTITY属性相同的定义创建影子表.切换到(这是仅元数据更改,不会影响表的定义的行移动)然后更新行并切换回来.

下面显示了从具有间隙到无间隙的情况的完整工作示例(为简洁起见,下面省略了错误处理和事务).

演示场景

/*Your original table*/
CREATE TABLE YourTable
(
Id INT IDENTITY PRIMARY KEY,
OtherColumns CHAR(100) NULL
)

/*Some dummy data*/
INSERT INTO YourTable (OtherColumns) VALUES ('A'),('B'),('C')

/*Delete a row leaving a gap*/
DELETE FROM YourTable WHERE Id =2 

/*Verify there is a gap*/
SELECT *
FROM YourTable
Run Code Online (Sandbox Code Playgroud)

删除差距

/*Create table with same definition as original but no `IDENTITY`*/
CREATE TABLE ShadowTable
(
Id INT PRIMARY KEY,
OtherColumns CHAR(100)
)

/*1st metadata switch*/
ALTER TABLE YourTable SWITCH TO ShadowTable;

/*Do the update*/  
WITH CTE AS
(
SELECT *,
       ROW_NUMBER() OVER (ORDER BY Id) AS RN
FROM  ShadowTable     
)
UPDATE CTE SET Id = RN

/*Metadata switch back to restore IDENTITY property*/  
ALTER TABLE ShadowTable SWITCH TO YourTable;

/*Remove unneeded table*/
DROP TABLE ShadowTable;

/*No Gaps*/
SELECT *
FROM YourTable
Run Code Online (Sandbox Code Playgroud)

  • @TomTom - 不,他们不是.测试一下.您将收到错误消息"无法更新标识列'Id'." (4认同)
  • @TomTom - 这是**插入**而不是更新.很高兴提前接受你的道歉. (4认同)
  • @TomTom,`IDENTITY_INSERT`,顾名思义,仅用于插入**,而不是更新 (3认同)
  • @TomTom - 你有没有打算删除你无根据的downvote呢? (2认同)

小智 6

  1. 删除PK约束
  2. 删除标识列
  3. 重新创建标识列
  4. 重新创建PK
USE Test
go

if(object_id('IdentityTest') Is not null)
drop table IdentityTest

create table IdentityTest
(
Id int identity not null,
Name varchar(5),
constraint pk primary key (Id)
)

set identity_insert dbo.IdentityTest ON
insert into  dbo.IdentityTest (Id,Name) Values(23,'A'),(26,'B'),(34,'C'),(35,'D'),(40,'E')
set identity_insert dbo.IdentityTest OFF



select * from IdentityTest

------------------1. Drop PK constraint ------------------------------------ 
ALTER TABLE [dbo].[IdentityTest] DROP CONSTRAINT [pk]
GO
------------------2. Drop Identity column -----------------------------------
ALTER table dbo.IdentityTest
drop column Id
------------------3. Re-create Identity Column -----------------------------------
ALTER table dbo.IdentityTest
add Id int identity(1,1)
-------------------4. Re-Create PK-----------------------
ALTER TABLE [dbo].[IdentityTest] ADD  CONSTRAINT [pk] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)

--------------------------------------------------------------
insert into  dbo.IdentityTest (Name) Values('F')
select * from IdentityTest
Run Code Online (Sandbox Code Playgroud)