Sha*_*kar 48 sql-server identity auto-increment sql-server-2008
我table1在SQL Server 2008中有一个表,它有记录.
我希望主键table1_Sno列是自动递增列.这可以在没有任何数据传输或克隆表的情况下完成吗?
我知道我可以使用ALTER TABLE添加自动增量列,但是我可以简单地将AUTO_INCREMENT选项添加到作为主键的现有列吗?
Mar*_*ith 64
更改IDENTITY属性实际上只是元数据更改.但是直接更新元数据需要在单用户模式下启动实例并乱搞一些列sys.syscolpars并且没有文档/不支持,而不是我建议的或将提供任何其他详细信息.
对于在SQL Server 2012+上遇到此答案的人来说,实现自动递增列结果的最简单方法是创建一个SEQUENCE对象并将其设置next value for seq为列默认值.
或者,或者对于以前的版本(从2005年开始),此连接项上发布的变通方法显示了完全支持的方法,无需使用大小的数据操作ALTER TABLE...SWITCH.还在这里发表关于MSDN的博客.虽然实现这一目的的代码并不是很简单,但存在一些限制 - 例如被更改的表不能成为外键约束的目标.
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
Run Code Online (Sandbox Code Playgroud)
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 TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
PRINT ERROR_MESSAGE();
END CATCH;
Run Code Online (Sandbox Code Playgroud)
INSERT INTO dbo.tblFoo (filler,filler2)
OUTPUT inserted.*
VALUES ('foo','bar')
Run Code Online (Sandbox Code Playgroud)
bar filler filler2
----------- --------- ---------
10001 foo bar
Run Code Online (Sandbox Code Playgroud)
DROP TABLE dbo.tblFoo
Run Code Online (Sandbox Code Playgroud)
此策略以物理方式将行复制大约两次,如果您要复制的表非常大,则可能需要更长的时间。
您可以保存数据,删除并使用自动增量和主键重建表,然后重新加载数据。
我将通过一个示例向您介绍:
第一步,创建表foobar(无主键,无自增):
CREATE TABLE foobar(
id int NOT NULL,
name nchar(100) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)
第2步,插入一些行
insert into foobar values(1, 'one');
insert into foobar values(2, 'two');
insert into foobar values(3, 'three');
Run Code Online (Sandbox Code Playgroud)
第 3 步,将 foobar 数据复制到临时表中:
select * into temp_foobar from foobar
Run Code Online (Sandbox Code Playgroud)
第4步,删除表foobar:
drop table foobar;
Run Code Online (Sandbox Code Playgroud)
第 5 步,使用主键和自动增量属性重新创建表:
CREATE TABLE foobar(
id int primary key IDENTITY(1, 1) NOT NULL,
name nchar(100) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)
第 6 步,将临时表中的数据插入回 foobar
SET IDENTITY_INSERT foobar ON
INSERT into foobar (id, name) select id, name from temp_foobar;
Run Code Online (Sandbox Code Playgroud)
第 7 步,删除临时表,然后检查它是否有效:
drop table temp_foobar;
select * from foobar;
Run Code Online (Sandbox Code Playgroud)
你应该得到这个,当你检查 foobar 表时,id 列自动递增 1 并且 id 是主键:
1 one
2 two
3 three
Run Code Online (Sandbox Code Playgroud)