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