我使用的是 SQL Server 2008。一个 int 列我用作主键但不是标识列(其值将自动增加 1)。我想将此列转换为标识列。任何解决方案?

提前致谢,
乔治

最佳答案

不幸的是,您无法将现有表上的字段更改为 IDENTITY

你应该:

  • 使用 IDENTITY 字段
  • 创建一个新表
  • 为新表
  • 发出 SET IDENTITY_INSERT ON
  • 将数据插入到新表中
  • 为新表
  • 发出 SET IDENTITY_INSERT OFF
  • 删除旧表
  • 将新表重命名为旧名称。

  • 您可以使用 SSMS 来更改字段类型,它会在幕后为您完成所有这些工作。

    这是一个示例表:
    CREATE TABLE plain (id INT NOT NULL PRIMARY KEY)
    
    INSERT
    INTO    plain
    VALUES  (1000)
    

    以及 SSMS 生成的脚本:
    SET ANSI_PADDING ON
    SET ANSI_WARNINGS ON
    COMMIT
    BEGIN TRANSACTION
    GO
    CREATE TABLE dbo.Tmp_plain
        (
        id int NOT NULL IDENTITY (1, 1)
        )  ON [PRIMARY]
    GO
    ALTER TABLE dbo.Tmp_plain SET (LOCK_ESCALATION = TABLE)
    GO
    SET IDENTITY_INSERT dbo.Tmp_plain ON
    GO
    IF EXISTS(SELECT * FROM dbo.plain)
         EXEC('INSERT INTO dbo.Tmp_plain (id)
            SELECT id FROM dbo.plain WITH (HOLDLOCK TABLOCKX)')
    GO
    SET IDENTITY_INSERT dbo.Tmp_plain OFF
    GO
    DROP TABLE dbo.plain
    GO
    EXECUTE sp_rename N'dbo.Tmp_plain', N'plain', 'OBJECT'
    GO
    ALTER TABLE dbo.plain ADD CONSTRAINT
        PK__plain__3213E83F1A609306 PRIMARY KEY CLUSTERED
        (
        id
        ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    
    GO
    COMMIT
    

    关于tsql - SQL Server 将列转换为标识列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3616813/

    10-13 07:33