簡體   English   中英

SQL重新設定有效,但自動增量從0開始

[英]SQL reseeding works but auto increment starts at 0

我有一些表,我有一個標識列,我試圖重新種植。 重播工作(我認為)但是當一個新的數據項插入到表中時,標識列從0開始。

我重新編寫的代碼是:

DBCC CHECKIDENT(MyTable,RESEED,0)

表的標識規范是:

  • 身份增量= 1
  • 身份種子= 1

快速注意我在重新播種前對表格執行刪除操作

請幫忙

當種子初始化為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM