Sql-Server
重置 SQL Server 2012 序列
我正在測試和填充利用該
SEQUENCE
對象的特定表。在這個過程中,我正在測試用數万條插入行填充表格(因為我不熟悉如何程式)。我在這個特定表中看到的問題是,當我開始另一個總體測試時,SEQUENCE
不會重置回我想要的第一個數字(即 1)。當我希望重新執行新測試時,我刪除有問題的表,然後執行以下命令:
DROP SEQUENCE foo.fee; GO DROP SCHEMA foo; GO
當我想重新執行測試時,我執行以下
SCHEMA
&SEQUENCE
命令,這些命令按以下順序觸發:CREATE SCHEMA foo; GO CREATE SEQUENCE foo.fee START WITH 1 INCREMENT BY 1 NO CYCLE NO CACHE; GO
然後我創建表:
CREATE TABLE foo.sample_table_with_data (order_number bigint PRIMARY KEY NOT NULL, sample_column_one nvarchar(max) NULL, sample_column_two nvarchar(max) NULL, sample_column_three nvarchar(max) NULL) GO
完成後,我執行以下插入命令 50,000 次:
INSERT INTO [foo].[sample_table_with_data] ( [order_number], [sample_column_one], [sample_column_two], [sample_column_three] ) VALUES ( NEXT VALUE FOR foo.fee, 'Blah', 'Blah Blah', 'Blah Blah Blah' )
現在數據進入表格是絕對沒有問題的。我遇到的挑戰是,當我刪除表時,刪除模式和序列,然後重新創建表、序列和模式,
SEQUENCE
從前一個數據庫化身中的最後一個數字中提取,而不是重置回一個。例如,如果序列中的最後一個數字是 634,534,則新表中的下一個序列號是 634,535。
刪除表並刪除模式和序列後,我執行以下命令來驗證序列和模式的刪除:
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA GO SELECT * FROM sys.sequences GO
我很困惑為什麼會這樣。是否有另一個我在這裡遺漏的命令可以幫助我本地化這裡到底發生了什麼?
我應該注意,該表屬於一個數據庫,其中有 7 個其他表都
SEQUENCE
正確執行了該命令。這是 SQL 2012 SP1 企業版安裝。
嘗試
ALTER SEQUENCE foo.fee RESTART
要麼:
ALTER SEQUENCE foo.fee RESTART WITH 1
使用您的腳本稍作改動:
CREATE SCHEMA foo; GO CREATE SEQUENCE foo.fee START WITH 1 INCREMENT BY 1 NO CYCLE NO CACHE; GO CREATE TABLE foo.sample_table_with_data (order_number bigint PRIMARY KEY NOT NULL, sample_column_one nvarchar(max) NULL, sample_column_two nvarchar(max) NULL, sample_column_three nvarchar(max) NULL) GO SET NOCOUNT ON GO INSERT INTO [foo].[sample_table_with_data] ([order_number],[sample_column_one],[sample_column_two],[sample_column_three]) VALUES (NEXT VALUE FOR foo.fee,'Blah','Blah Blah','Blah Blah Blah') GO 50000 SELECT MIN(order_number), MAX(order_number) FROM foo.sample_table_with_data AS stwd GO DROP SEQUENCE foo.fee; GO DROP TABLE foo.sample_table_with_data GO DROP SCHEMA foo;
…我無法在 SQL Server 2012 SP1(內部版本 3000)或更高版本上重現該問題。
我也找不到提及此特定場景的 Connect 項目或知識庫文章(並且還有很多其他
SEQUENCE
問題)。這並不是說它在 SP1 之前不存在,因為並非所有修復最終都被記錄在案。