我们可以更改已存在的标识列的步长值吗?

时间:2012-01-05 09:34:32

标签: sql sql-server

我们可以更改已存在的标识列的步长值吗?如果是,最大值是多少?

由于

3 个答案:

答案 0 :(得分:4)

是的,您必须创建新表的副本,使用旧表中的数据填充它,删除旧表,重命名副本。您可以通过更改SSMS GUI中的步长并查看生成的脚本来查看如何

最大步长?根据{{​​3}},我猜你的列数据类型一样高。因此,对于tinyint等,不要使用从1开始的4000增量

答案 1 :(得分:2)

您可以将此作为仅元数据更改。下面的示例代码。

 --Seed Set to 1
CREATE TABLE dbo.tblFoo 
(
id INT IDENTITY(1,1) PRIMARY KEY,
baz INT
)


INSERT INTO dbo.tblFoo
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1, master..spt_values v2


--Change Seed to 7
BEGIN TRY;
    BEGIN TRANSACTION;

    SELECT TOP 0 id 
    FROM dbo.tblFoo
    WITH (TABLOCKX,HOLDLOCK)



    DECLARE @TableScript nvarchar(max)
    SELECT @TableScript = 
    '
    CREATE TABLE dbo.Destination(
        id INT IDENTITY(' + 
                     CAST(ISNULL(IDENT_CURRENT('tblFoo'),0)+1 AS VARCHAR) + ',7)  PRIMARY KEY,
        baz INT
        )

        ALTER TABLE dbo.tblFoo SWITCH TO dbo.Destination;
    '       


    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;

 INSERT INTO dbo.tblFoo 
 OUTPUT INSERTED.*     
 VALUES (1),(2)

答案 2 :(得分:0)

仅通过重新创建和重新填充表格