在 SQL Server(在我的例子中,2005)中,如何使用 T-SQL 将标识属性添加到现有表列?
就像是:
alter table tblFoo
alter column bar identity(1,1)
在 SQL Server(在我的例子中,2005)中,如何使用 T-SQL 将标识属性添加到现有表列?
就像是:
alter table tblFoo
alter column bar identity(1,1)
我不相信你能做到。您最好的选择是创建一个新的标识列并使用标识插入命令复制数据(如果您确实想保留旧值)。
这是一篇体面的文章,详细描述了该过程: http ://www.mssqltips.com/tip.asp?tip=1397
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) !:)
表格是否已填充?如果不删除并重新创建表。
如果填充了列中已经存在哪些值?如果它们是您不想保留的值。
根据需要创建一个新表,将旧表中的记录加载到新表中,并让数据库正常填充标识列。重命名您的原始表并将新表重命名为正确的名称:)。
最后,如果您希望标识的列当前包含主键值并且已被其他表引用,那么您将需要完全重新考虑,如果您确定这是您想要做的:)
没有直接的方法可以做到这一点,除了:
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工具 -> 选项 -> 设计器 -> 表和数据库设计器 ,然后取消选中“防止保存需要重新创建表的更改”选项
需要注意的事项:
创建一个新表
SELECT * INTO Table_New FROM Table_Current WHERE 1 = 0;
从新表中删除列
Alter table Table_New drop column id;
添加具有标识的列
Alter table Table_New add id int primary key identity;
获取新表中的所有数据
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;
删除旧表
drop table Table_Current;
将新表重命名为旧表
EXEC sp_rename 'Table_New', 'Table_Current';
alter table tablename
alter column columnname
add Identity(100,1)