SQL Server,如何在创建没有数据丢失的表后设置自动增量?

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)


Eri*_*ski 5

SQL Server:如何在包含行的表上设置自动增量:

此策略以物理方式将行复制大约两次,如果您要复制的表非常大,则可能需要更长的时间。

您可以保存数据,删除并使用自动增量和主键重建表,然后重新加载数据。

我将通过一个示例向您介绍:

第一步,创建表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)