首页 文章

SQL Server将自动增量主键添加到现有表

提问于
浏览
203

作为 Headers ,我有一个已经填充了150000条记录的现有表 . 我添加了一个Id列(当前为null) .

我假设我可以运行查询以使用增量数填充此列,然后设置为主键并启用自动增量 . 这是正确的方法吗?如果是这样,我如何填写初始数字?

13 回答

  • 351

    不 - 你必须反过来这样做:从get get开始直接添加 INT IDENTITY - 执行此操作时将填充标识值:

    ALTER TABLE dbo.YourTable
       ADD ID INT IDENTITY
    

    然后你可以把它作为主键:

    ALTER TABLE dbo.YourTable
       ADD CONSTRAINT PK_YourTable
       PRIMARY KEY(ID)
    

    或者如果你喜欢一步到位:

    ALTER TABLE dbo.YourTable
       ADD ID INT IDENTITY
           CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
    
  • 9

    你不能“打开”IDENTITY:它是一个表重建 .

    如果您不关心数字顺序,则可以一次性添加带有IDENTITY的列NOT NULL . 150k行不是很多 .

    如果您需要保留一些数字顺序,请相应地添加数字 . 然后使用SSMS表设计器设置IDENTITY属性 . 这允许您生成一个脚本,该脚本将为您执行列删除/添加/保留数字/重新设置 .

  • 0

    我有这个问题,但无法使用标识列(出于各种原因) . 我决定这个:

    DECLARE @id INT
    SET @id = 0 
    UPDATE table SET @id = id = @id + 1
    

    借用here .

  • 4

    如果列已存在于表中且为null,则可以使用此命令更新列(替换id,tablename和tablekey):

    UPDATE x
    SET x.<Id> = x.New_Id
    FROM (
      SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
      FROM <tablename>
      ) x
    
  • 18

    当我们在现有表中添加和标识列时,它将自动填充,无需手动填充它 .

  • 2

    通过设计师你可以设置标识(1,1)右键单击tbl => desing =>在左侧(右键单击)=> properties =>在标识列中选择#column

    Properties

    idendtity column

  • 0

    这是一个你可以尝试的想法 . 原始表 - 没有标识列table1创建一个新表 - 调用table2以及标识列 . 将数据从table1复制到table2 - 使用自动递增的数字自动填充标识列 .

    重命名原始表 - table1到table3将新表重命名 - table2重命名为table1(原始表)现在,您将table1包含标识列并填充现有数据 . 在确保没有问题并且正常工作之后,在不再需要时删除table3 .

  • 0

    创建一个具有不同名称和相同列,主键和外键关联的新表,并在您的Insert语句中链接它 . 例如:对于员工,请使用EMPLOYEES替换 .

    CREATE TABLE EMPLOYEES(
    
        EmpId        INT NOT NULL IDENTITY(1,1), 
        F_Name       VARCHAR(20) ,
        L_Name       VARCHAR(20) ,
        DOB          DATE ,
        DOJ          DATE ,
        PRIMARY KEY (EmpId),
        DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
        DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
        AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
    )
    

    但是,您必须删除现有的EMPLOYEE表或根据您的要求进行一些调整 .

  • -3

    如果您的表使用其主键或foriegen键与其他表有关系,则可能无法更改您的表 . 所以你需要再次删除并创建表 .
    要解决这些问题,您需要通过右键单击数据库生成脚本,并在高级选项集数据类型中编写脚本到方案和数据 . 之后,使用此脚本更改列以使用运行其查询来标识和重新生成表 .
    您的查询将如下所示:

    USE [Db_YourDbName]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    Drop TABLE [dbo].[Tbl_TourTable]
    
    CREATE TABLE [dbo].[Tbl_TourTable](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Name] [nvarchar](50) NULL,
        [Family] [nvarchar](150) NULL)  
    
    GO
    
    SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 
    
    INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
    INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
    INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
    INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
    INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
    INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
    INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
    
    SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off
    
  • -3

    这个答案是对最高投票答案的一个小补充,适用于SQL Server . 该问题请求自动增量主键,当前答案确实添加了主键,但未标记为自动增量 . 下面的脚本检查列是否存在,并在启用自动增量标志的情况下添加它 .

    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
    BEGIN
    
    
    ALTER TABLE dbo.YourTable
       ADD PKColumnName INT IDENTITY(1,1)
    
    CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
    
    END
    
    GO
    
  • 0

    尝试这样的事情(首先在测试台上):

    USE your_database_name
    GO
    WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0
    BEGIN
        SET ROWCOUNT 1
        UPDATE your_table SET your_id_field = MAX(your_id_field)+1
    END
    PRINT 'ALL DONE'
    

    我根本没有测试过这个,所以要小心!

  • 2

    这在MariaDB中有效,所以我只希望它在SQL Server中运行:删除刚刚插入的ID列,然后使用以下语法: -

    ALTER TABLE table_name ADD id INT PRIMARY KEY AUTO_INCREMENT;

    不需要另一张 table . 这只是插入一个id列,使其成为主索引,并使用顺序值填充它 . 如果SQL Server不这样做,我很抱歉浪费你的时间 .

  • -3

    ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT;这可能很有用

相关问题