SQLServer,如何在创建表后设置自动增量而不丢失数据?我有张桌子table1在Sqlserver 2008中,其中有记录。我要主键table1_Sno列为自动递增列。在不进行任何数据传输或表克隆的情况下,能做到这一点吗?我知道我可以使用ALTERTABLE来添加一个自动增量列,但是我可以简单地将AUTO_CREATION选项添加到作为主键的现有列中吗?
3 回答
温温酱
TA贡献1752条经验 获得超4个赞
IDENTITY
sys.syscolpars
SEQUENCE
next value for seq
ALTER TABLE...SWITCH
示例代码。
设置测试表 identity
列。
CREATE TABLE dbo.tblFoo (bar INT PRIMARY KEY,filler CHAR(8000),filler2 CHAR(49))INSERT INTO dbo.tblFoo (bar)SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))FROM master..spt_values v1, master..spt_values v2
修改为有一个 identity
列(或多或少是瞬间的)。
BEGIN TRY; BEGIN TRANSACTION; /*Using DBCC CHECKIDENT('dbo.tblFoo') is slow so use dynamic SQL to set the correct seed in the table definition instead*/ DECLARE @TableScript nvarchar(max) SELECT @TableScript = ' CREATE TABLE dbo.Destination( bar INT IDENTITY(' + CAST(ISNULL(MAX(bar),0)+1 AS VARCHAR) + ',1) PRIMARY KEY, filler CHAR(8000), filler2 CHAR(49) ) ALTER TABLE dbo.tblFoo SWITCH TO dbo.Destination; ' FROM dbo.tblFoo WITH (TABLOCKX,HOLDLOCK) EXEC(@TableScript) DROP TABLE dbo.tblFoo; EXECUTE sp_rename N'dbo.Destination', N'tblFoo', 'OBJECT'; COMMIT TRANSACTION;END TRYBEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; PRINT ERROR_MESSAGE();END CATCH;
测试结果。
INSERT INTO dbo.tblFoo (filler,filler2) OUTPUT inserted.*VALUES ('foo','bar')
施予
bar filler filler2----------- --------- ---------10001 foo bar
洗净
DROP TABLE dbo.tblFoo
- 3 回答
- 0 关注
- 876 浏览
添加回答
举报
0/150
提交
取消