我需要将表的主键更改为一个标识列,表中已经有很多行.

我有一个脚本来清理ID,以确保它们从1开始按顺序排列,在我的测试数据库上运行良好.

将列更改为具有标识属性的SQL命令是什么?

推荐答案

不能为标识更改现有列.

你有两个 Select ,

  1. 使用identity&;创建一个新表;删除现有表

  2. 使用identity&;删除现有列

方法1.(New table)在这里,您可以保留新创建的标识列上的现有数据值.请注意,如果不满足"if not exists"(如果不存在),您将丢失所有数据,因此请确保您也将该条件置于放置状态!

CREATE TABLE dbo.Tmp_Names
    (
      Id int NOT NULL
             IDENTITY(1, 1),
      Name varchar(50) NULL
    )
ON  [PRIMARY]
go

SET IDENTITY_INSERT dbo.Tmp_Names ON
go

IF EXISTS ( SELECT  *
            FROM    dbo.Names ) 
    INSERT  INTO dbo.Tmp_Names ( Id, Name )
            SELECT  Id,
                    Name
            FROM    dbo.Names TABLOCKX
go

SET IDENTITY_INSERT dbo.Tmp_Names OFF
go

DROP TABLE dbo.Names
go

Exec sp_rename 'Tmp_Names', 'Names'

方法2(New column)您不能在新创建的标识列上保留现有数据值,标识列将保留数字序列.

Alter Table Names
Add Id_new Int Identity(1, 1)
Go

Alter Table Names Drop Column ID
Go

Exec sp_rename 'Names.Id_new', 'ID', 'Column'

有关详细信息,请参阅以下Microsoft SQL Server论坛帖子:

How to alter column to identity(1,1)

Sql相关问答推荐

在SELECT陈述中使用子查询提高查询性能

识别顺序记录组

具有2个共享列的两个表的Amazon RSQL合并

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

计算分段的总权重

为什么在postgres中,横向连接比相关子查询快?

按日期时间(不包括秒)连接表

对列进行排序后,基于两列删除重复行

数据库SQL-CTE命名空间(错误?)使用临时视图

删除所有订单中可用的重复值

基于开始/结束日期重叠的BigQuery突发行

使用递归CTE在BigQuery中获取文件路径

使用多个数据库调用重载 CQRS 模式

汇总具有连续日期范围的行

按公司和产品查询最近发票的平均价格的SQL查询

使用row_number() over partition by保留首次出现且值不为空的行的方法

避免在SQL中使用具有相同条件的多个子查询

在 SQL 查询中创建滚动日期

Postgres:表的累积视图

交叉应用 OPENJSON / PIVOT - 错误的顺序