SQLServer,如何在创建表后设置自动增量而不丢失数据?我有张桌子table1在Sqlserver 2008中,其中有记录。我要主键table1_Sno列为自动递增列。在不进行任何数据传输或表克隆的情况下,能做到这一点吗?我知道我可以使用ALTERTABLE来添加一个自动增量列,但是我可以简单地将AUTO_CREATION选项添加到作为主键的现有列中吗?
3 回答
温温酱
TA贡献1752条经验 获得超4个赞
IDENTITYsys.syscolpars
SEQUENCEnext 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 关注
- 972 浏览
添加回答
举报
0/150
提交
取消
