36

在 SQL Server(在我的例子中,2005)中,如何使用 T-SQL 将标识属性添加到现有表列?

就像是:

alter table tblFoo 
    alter column bar identity(1,1)
4

6 回答 6

31

我不相信你能做到。您最好的选择是创建一个新的标识列并使用标识插入命令复制数据(如果您确实想保留旧值)。

这是一篇体面的文章,详细描述了该过程: http ://www.mssqltips.com/tip.asp?tip=1397

于 2008-11-13T20:59:46.443 回答
12

Vikash 发布的解决方案不起作用;它在 SQL Management Studio(2005 年,如 OP 指定)中产生“语法错误”错误。SQL Server的“精简版”支持这种操作只是一个捷径,因为真正的过程更像是Robert & JohnFX所说的——创建重复表,填充数据,重命名原始表和新表适当地。

如果您想保留需要成为身份的字段中已经存在的值,您可以执行以下操作:

CREATE TABLE tname2 (etc.)
INSERT INTO tname2 FROM tname1

DROP TABLE tname1
CREATE TABLE tname1 (with IDENTITY specified)

SET IDENTITY_INSERT tname1 ON
INSERT INTO tname1 FROM tname2
SET IDENTITY_INSERT tname1 OFF

DROP tname2

当然,不建议删除并重新创建实时代码使用的表(tname1) !:)

于 2009-05-26T21:14:21.773 回答
2

表格是否已填充?如果不删除并重新创建表。

如果填充了列中已经存在哪些值?如果它们是您不想保留的值。

根据需要创建一个新表,将旧表中的记录加载到新表中,并让数据库正常填充标识列。重命名您的原始表并将新表重命名为正确的名称:)。

最后,如果您希望标识的列当前包含主键值并且已被其他表引用,那么您将需要完全重新考虑,如果您确定这是您想要做的:)

于 2008-11-14T12:08:36.623 回答
2

没有直接的方法可以做到这一点,除了:

A) 通过 SQL即:

-- make sure you have the correct CREATE TABLE script ready with IDENTITY

SELECT * INTO abcTable_copy FROM abcTable

DROP TABLE abcTable

CREATE TABLE abcTable -- this time with the IDENTITY column

SET IDENTITY_INSERT abcTable ON

INSERT INTO abcTable (..specify all columns!) FROM (..specify all columns!) abcTable_copy

SET INDENTITY_INSERT abcTable OFF

DROP TABLE abcTable_copy 

-- I would suggest to verify the contents of both tables 
-- before dropping the copy table

B)通过MSSMS,它在后台会做同样的事情,但会减少胖手指。

  • 在 MSSMS 对象资源管理器中右键单击您需要修改的表
  • 选择“设计” 选择您要添加 IDENTITY 的列
  • 将身份设置从 NO -> YES(可能是种子)更改
  • Ctr+S 表格

在此处输入图像描述

这将删除并重新创建包含所有原始数据的表。如果您收到警告:

在此处输入图像描述

转到 MSSMS工具 -> 选项 -> 设计器 -> 表和数据库设计器 ,然后取消选中“防止保存需要重新创建表的更改”选项

需要注意的事项:

  1. 在您执行此操作之前,您的数据库有足够的磁盘空间
  2. 数据库未使用(尤其是您正在更改的表)
  3. 确保在执行之前备份您的数据库
  4. 如果表有很多数据(超过 1G),请先在其他地方尝试,然后再在实际数据库中使用
于 2017-01-25T19:50:45.973 回答
2
  1. 创建一个新表

    SELECT * INTO Table_New FROM Table_Current WHERE 1 = 0;
    
  2. 从新表中删除列

    Alter table Table_New drop column id;
    
  3. 添加具有标识的列

    Alter table Table_New add id int primary key identity; 
    
  4. 获取新表中的所有数据

    SET IDENTITY_INSERT Table_New ON;
    INSERT INTO Table_New (id, Name,CreatedDate,Modified) 
    SELECT id, Name,CreatedDate,Modified FROM Table_Current;
    SET IDENTITY_INSERT Table_New OFF;
    
  5. 删除旧表

    drop table Table_Current;
    
  6. 将新表重命名为旧表

    EXEC sp_rename 'Table_New', 'Table_Current';
    
于 2019-07-04T10:16:05.190 回答
-5
alter table tablename 
alter column columnname 
add Identity(100,1)
于 2009-02-26T15:06:57.457 回答