【问题标题】:How to set identity column to created table in SQL server如何在 SQL Server 中将标识列设置为创建的表
【发布时间】:2013-04-17 18:50:26
【问题描述】:

我在 SQL Server 中这样创建了一个表:

CREATE TABLE [UserName]
(
   [ID] [int] NOT NULL ,
   [Name] [nvarchar] (50) NOT NULL ,
   [Address] [nvarchar] (200) NULL

   CONSTRAINT [PK_UserName] PRIMARY KEY CLUSTERED ([ID] ASC)
) ON [PRIMARY]
GO

如果我想让ID 成为一个身份列,我需要什么?我是否需要删除并创建此表并将 ID 设置为 [ID] [int] IDENTITY(1,1) NOT NULL

使用 drop 和 create,UserName 表中的所有数据都将丢失。

是否有另一种方法可以将IDENTITY COLUMN 设置为已创建的表 的列而不丢失数据?

我使用 SQL Server 2008 R2 :)

【问题讨论】:

  • 您可以只删除列 - 而不是整个表。但是您不能IDENTITY 规范添加到现有列 - 这是不可能的。
  • @marc_s:嗯,这是有道理的。但是如果我的表的 ID 列已经在其他地方用作 FK,有没有更简单的方法?
  • @karank:不,很遗憾,您不能将IDENTITY 规范添加到现有列中。
  • @marc_s 你错了。将鼠标悬停在表格上,右键单击 -> 设计。单击所需的列,然后在列属性中,滚动到 Identity specification 并将 no 更改为 yes。
  • @MH:是的——你知道那是做什么的吗?它删除现有表,然后重新创建具有标识规范的表。您不能将标识规范添加到现有表、现有列。期间。

标签: sql-server sql-server-2008-r2


【解决方案1】:
ALTER TABLE [UserName] DROP COLUMN [ID];

ALTER TABLE [UserName] 
    ADD [ID] integer identity not null;

【讨论】:

  • 这将创建列,但所有数据仍将丢失
  • @Phil:不,不是“所有数据”。仅现有 ID 列的值。如果该表被其他表引用,这确实可能是一个问题。
  • 我的意思是列中的“所有数据” - 但感谢您的澄清
  • @phil:我不认为 zey 在提到“不丢失数据”时指的是现有的 ID 值 - 仅指现有的用户名和地址。
【解决方案2】:

试试这个 -

DECLARE @temp TABLE
(
      ID INT NOT NULL 
    , Name NVARCHAR(50) NOT NULL 
    , [Address] NVARCHAR(200) NULL
) 

INSERT INTO @temp (ID, Name, [Address])
SELECT ID, Name, [Address]
FROM dbo.UserName

DROP TABLE dbo.UserName

CREATE TABLE dbo.UserName
(
      [ID] [int] IDENTITY(1,1) NOT NULL 
    , [Name] [nvarchar] (50) NOT NULL 
    , [Address] [nvarchar] (200) NULL
CONSTRAINT [PK_UserName] PRIMARY KEY CLUSTERED 
([ID] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

SET IDENTITY_INSERT dbo.UserName ON

INSERT INTO dbo.UserName (ID, Name, [Address])
SELECT ID, Name, [Address] 
FROM @temp

SET IDENTITY_INSERT dbo.UserName OFF

【讨论】:

  • 使用temp table,这很好!
【解决方案3】:

最简单的方法:-

  1. 在对象资源管理器中右键单击表格并选择“设计”

  2. 选择要设置标识的列并转到列属性

  3. 在“身份规范”下将“(是身份)”更改为“是”

  4. 点击保存....完成:)

希望对你有帮助

【讨论】:

    【解决方案4】:

    这是一个最少记录的解决方案。

    SELECT 
        IDENTITY(INT, 1,1) AS ID,
        Name, [Address]
    INTO dbo.UserName_temp
    FROM dbo.UserName;
    
    
    ALTER TABLE dbo.UserName_temp
        ADD CONSTRAINT [PK_UserName] PRIMARY KEY CLUSTERED;
    
    DROP TABLE dbo.UserName;
    
    EXEC sp_rename 'dbo.UserName_temp', 'UserName';
    

    SRC: http://sqlmag.com/sql-server/appending-identity-column-temporary-table

    但是 IDENTITY() 函数“只能在带有 INTO 表子句的 SELECT 语句中”。

    http://msdn.microsoft.com/en-us/library/ms189838.aspx

    【讨论】:

      猜你喜欢
      • 2013-12-14
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2017-05-25
      • 2013-07-17
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多