我需要“重置”身份栏ex。(1,3,8)到(1,2,3)

时间:2018-03-28 10:59:13

标签: tsql identity reset sql-server-2017

我被要求以这种方式重置Auto_Increment(标识)列:+ Auto_Increment(1,3,8,10)到这个New_Auto_Increment(1,2,3,4)。我不想删除列并重建,因为它可能导致严重的问题。感谢

2 个答案:

答案 0 :(得分:1)

分配新IDENTITY值的一种方法是使用新值加载登台表,然后使用SWITCH将新数据移回源表。如果外键引用该表,则需要删除并重新创建这些表(并更新引用键值)。下面的示例脚本。

--example setup
CREATE TABLE dbo.Example(
      ID int NOT NULL IDENTITY CONSTRAINT PK_Example PRIMARY KEY
    , SomeData int
    );
GO
SET IDENTITY_INSERT dbo.Example ON;
GO
INSERT INTO dbo.Example(ID, SomeData) VALUES (1,1),(3,1),(8,1),(10,1);
GO

BEGIN TRY

    BEGIN TRAN;

    --create staging table with same schema, constraints and indexes
    CREATE TABLE dbo.ExampleStaging(
          ID int NOT NULL CONSTRAINT PK_Example_ExampleStaging PRIMARY KEY
        , SomeData int
        );

    --load staging table with new values
    INSERT INTO dbo.ExampleStaging
        SELECT ROW_NUMBER() OVER(ORDER BY ID), SomeData
        FROM dbo.Example;

    --clear source table
    TRUNCATE TABLE dbo.Example;

    --switch new data back into original table
    ALTER TABLE dbo.ExampleStaging
        SWITCH TO dbo.Example;

    DROP TABLE dbo.ExampleStaging;

    DBCC CHECKIDENT('dbo.Example');

    COMMIT;

END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;
GO

还可以删除并重新创建列以重新分配标识值。该方法的含义是:

1)需要首先删除并重新创建列上的索引(例如主键约束)。对于聚簇索引,表上的所有非聚簇索引将被隐式重建两次,一次是在删除聚簇索引时,一次是在重新创建时。但是,可以显式删除并重新创建非聚集索引,以便只发生一次。

2)新的标识值与原始值不在同一增量序列中。除非人们期望值反映插入顺序,否则这可能不是问题。

3)表格中的每一行都需要更新两次,一次是在删除原始标识列时,再次在创建新标识列时再次更新。

答案 1 :(得分:0)

可以使用row_number()和光标
来完成 甚至可以清理任何FK

var promise = element(by.id("closeNotification")).isPresent(); // point A

console.log(promise);

promise.then((message) => {
    element(by.id("closeNotification")).click();
        browser.sleep(3000);
}, (errorMessage) => {                // Point B
    browser.refresh();
});