[英]SQL reseeding works but auto increment starts at 0
我有一些表,我有一個標識列,我試圖重新種植。 重播工作(我認為)但是當一個新的數據項插入到表中時,標識列從0開始。
我重新編寫的代碼是:
DBCC CHECKIDENT(MyTable,RESEED,0)
表的標識規范是:
快速注意我在重新播種前對表格執行刪除操作
請幫忙
當種子初始化為0時,似乎“未初始化”或截斷表(意味着沒有數據插入到表中)將從0開始。但是當數據已插入表中並且刪除用於清除所有數據時表的行。 重新設定為0只會將數據庫的最后一個種子保留為0,下一個種子為1。
這里說的是一個復制問題的例子:
-- Script to create a test table
IF EXISTS(SELECT 1 FROM Information_Schema.Tables WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'SeedTest') BEGIN
DROP TABLE SeedTest
END
-- Create a Test Seed Table
CREATE TABLE [dbo].[SeedTest](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Value] [varchar](255) NOT NULL,
CONSTRAINT [PK_SeedTest] PRIMARY KEY CLUSTERED
(
[Id] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
-- When a table is truncated or "Not Initialized" (meaning no data EVER inserted)
-- An initial reseed of 0 will make the first identity insert value = 0.
DBCC CHECKIDENT (SeedTest, RESEED, 0)
GO
INSERT INTO SeedTest([Value]) VALUES('Test')
SELECT * FROM SeedTest
GO
-- If you truncate the table and reseed the same effect will occur (first identity insert value = 0).
TRUNCATE TABLE SeedTest
GO
DBCC CHECKIDENT (SeedTest, RESEED, 0)
GO
INSERT INTO SeedTest([Value]) VALUES('Test')
SELECT * FROM SeedTest
-- When Deleting records from a table (Foreign key constraints may prevent a truncate)
-- Reseeding to 0 will set the last seed to 0 and make the next seed = 1
DELETE FROM SeedTest
GO
DBCC CHECKIDENT (SeedTest, RESEED, 0)
GO
INSERT INTO SeedTest([Value]) VALUES('Test')
SELECT * FROM SeedTest
GO
我認為你在尋找的是:
DBCC CHECKIDENT(MyTable, RESEED, -1)
這僅在表已增加時,即已添加行然后刪除。 下一個插入的行現在將遞增,給出0。
如果表沒有行,請使用:DBCC CHECKIDENT(MyTable,RESEED,0)
使用該命令,您告訴IDENTITY將自己設置為0作為新種子。
它不會返回到原始定義( IDENTITY(1,1)
),而是返回到您在DBCC命令中指定為第三個參數的值。
如果您想返回使用1作為種子值,請使用:
DBCC CHECKIDENT(MyTable, RESEED, 1)
如果你想轉到100,請使用:
DBCC CHECKIDENT(MyTable, RESEED, 100)
您使用DBCC CHECKIDENT
定義和設置的值將是您在該表中插入行時用於IDENTITY
列的第一個新值。
當您查看MSDN聯機叢書文檔時 ,您可以看到:
DBCC CHECKIDENT
(
table_name
[ , { NORESEED | { RESEED [ ,new_reseed_value ] } } ]
)
new_reseed_value
是否將新值用作標識列的當前值。
所以你真的是誰定義了IDENTITY
列的新值 - 如果你像在帖子中那樣傳入0,那么它將為0 - 這就是你所要求的,畢竟......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.