在SQL Server中(在我的情况下,是2005),如何使用T-SQL将身份属性添加到现有表列中?
类似于:
类似于:
alter table tblFoo
alter column bar identity(1,1)
alter table tblFoo
alter column bar identity(1,1)
我不相信你可以做到那样。最好的办法是创建一个新的身份列,并使用身份插入命令将数据复制过去(如果您确实想保留旧值)。
这里有一篇不错的文章,详细描述了该过程:
http://www.mssqltips.com/tip.asp?tip=1397CREATE 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)是不建议的! :)
这个表是否已经有数据了?如果没有,就删除并重新创建该表。
如果表中已经存在值,那么这些值是不是你想要保留的值呢?
按照你的要求创建一个新表,将原表中的记录加载到新表中,并让数据库正常地填充identity列。然后将原始表重命名,将新表重命名为正确的名称 :)
最后,如果你想将某个列设为identity,而该列当前包含主键值并且已被其他表引用,那么你需要彻底重新考虑一下,确认这是否是你想要做的操作 :)
Create a New Table
SELECT * INTO Table_New FROM Table_Current WHERE 1 = 0;
Drop Column from New Table
Alter table Table_New drop column id;
Add column with identity
Alter table Table_New add id int primary key identity;
Get All Data in New Table
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 old Table
drop table Table_Current;
Rename New Table as old One
EXEC sp_rename 'Table_New', 'Table_Current';
除了通过SQL之外,没有直接的方法可以做到这一点:
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 工具->选项->设计师->表和数据库设计师, 然后取消选中"防止保存需要重新创建表的更改"选项。
需要注意的事项:
alter table tablename
alter column columnname
add Identity(100,1)