Перезаполнение SQL работает, но автоинкремент начинается с 0 - PullRequest
3 голосов
/ 02 июля 2010

У меня есть таблица с столбцом идентификаторов, который я пытаюсь заполнить заново. Повторное заполнение работает (я думаю), но когда новый элемент данных вставляется в таблицу, столбец идентификаторов начинается с 0.

Мой код для повторного заполнения:

DBCC CHECKIDENT (MyTable, RESEED, 0)

Характеристики идентичности для таблиц:

  • Повышение идентичности = 1
  • Identity Seed = 1

БЫСТРОЕ ПРИМЕЧАНИЕ Я выполняю удаление таблиц перед повторным заполнением

Пожалуйста, помогите

Ответы [ 3 ]

6 голосов
/ 16 февраля 2011

Похоже, что «неинициализированные» или усеченные таблицы (то есть данные никогда не вставлялись в таблицу), когда начальное число инициализируется в 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
4 голосов
/ 03 марта 2016

Я думаю, что вы ищете:

DBCC CHECKIDENT(MyTable, RESEED, -1)

Это только если таблица была увеличена, то есть строка была добавлена, а затем удалена.Следующая вставленная строка будет теперь увеличиваться, давая 0.

В случае, если в таблице не было строк, используйте: DBCC CHECKIDENT (MyTable, RESEED, 0)

1 голос
/ 02 июля 2010

Используя эту команду, вы говорите IDENTITY, чтобы установить его обратно в 0 в качестве нового начального числа.

Это не вернется к исходному определению (IDENTITY(1,1)), но к значению, которое вы указываете в качестве третьего параметра в команде DBCC.

Если вы хотите вернуться к использованию 1 в качестве начального значения, используйте:

DBCC CHECKIDENT(MyTable, RESEED, 1)

Если вычтобы перейти к 100, используйте:

DBCC CHECKIDENT(MyTable, RESEED, 100)

То значение, которое вы определили и установили с помощью DBCC CHECKIDENT, будет первым новым значением, использованным для столбца IDENTITY, когда вы вставите в него строкутаблица.

Когда вы просматриваете документацию MSDN Books Online , вы видите:

DBCC CHECKIDENT 
( 
    table_name
        [ , { NORESEED | { RESEED [ ,new_reseed_value ] } } ]
)

new_reseed_value

Это новое значениеиспользовать в качестве текущего значения столбца идентификаторов.

Таким образом, именно вы определяете новое значение столбца IDENTITY - если вы передадите 0, как в своем сообщении, оно будетбыть 0 - это то, что вы просили, в конце концов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...