Reset Автоинкремент в SQL Server после удаления

Я удалил некоторые записи из таблицы в базе данных SQL Server. Теперь идентификатор идет от 101 до 1200. Я хочу снова удалить записи, но я хочу, чтобы ID вернулся к 102. Есть ли способ сделать это в SQL Server?

Ответ 1

Выполните следующую команду, чтобы перезагрузить mytable, начиная с 1:

DBCC CHECKIDENT (mytable, RESEED, 0)

Прочитайте об этом в книге on-line (BOL, SQL help). Также будьте осторожны, чтобы у вас не было записей, превышающих заданное вами семя.

Ответ 2

DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

если number = 0, то в следующей вставке поле автоматического приращения будет содержать значение 1

если number = 101, то в следующей вставке поле автоматического приращения будет содержать значение 102


Дополнительная информация... Может быть вам полезна

Перед добавлением автоматического приращения number в приведенном выше запросе вы должны убедиться, что ваш столбец с автоматическим приращением таблицы содержит значения меньше number.

Чтобы получить максимальное значение столбца (column_name) из таблицы (таблица1), вы можете использовать следующий запрос

 SELECT MAX(column_name) FROM table1

Ответ 4

Если вы используете MySQL, попробуйте следующее:

ALTER TABLE tablename AUTO_INCREMENT = 1

Ответ 5

Я понял это. Это:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)

Ответ 6

Удалить и переместить все таблицы в базе данных.

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.

Ответ 7

Основываясь на принятом ответе, для тех, кто столкнулся с аналогичной проблемой, с полной квалификацией схемы:

([MyDataBase].[MySchemaName].[MyTable])... приводит к ошибке, вы должны быть в контексте этой БД

То есть следующее выдает ошибку:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

Включите полное имя таблицы с одинарными кавычками:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)

Ответ 8

Несколько ответов рекомендуют использовать инструкцию примерно так:

DBCC CHECKIDENT (mytable, RESEED, 0)

Но ОП сказал "удалил некоторые записи", и это может быть не все из них, поэтому значение 0 не всегда является правильным. Другой ответ предложил автоматически находить максимальное текущее значение и повторять его, но это приводит к проблемам, если в таблице нет записей, и поэтому max() возвращает NULL. Комментарий, предлагаемый просто

DBCC CHECKIDENT (mytable)

до reset значение, но в другом комментарии правильно указано, что это только увеличивает значение до максимума уже в таблице; это не уменьшит значение, если оно уже выше максимального в таблице, что и хотел сделать OP.

Лучшее решение объединяет эти идеи. Первый CHECKIDENT сбрасывает значение в 0, а второй сбрасывает его до наивысшего значения в настоящее время в таблице, если в таблице есть записи:

DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

Как указано в нескольких комментариях, убедитесь, что в других таблицах нет внешних ключей, указывающих на удаленные записи. В противном случае эти внешние ключи будут указывать на записи, которые вы создаете после повторного набора таблицы, что почти наверняка не то, что вы имели в виду.

Ответ 9

Вы не хотите этого делать вообще. Reseed может создавать проблемы с целостностью данных. Это действительно только для использования в системах разработки, где вы удаляете все тестовые данные и начинаете все заново. Его нельзя использовать в производственной системе, если все связанные записи не были удалены (не каждая таблица, которая должна быть связана с внешним ключом!). Вы можете создать беспорядок, делая это, и особенно если вы хотите сделать это на регулярной основе после каждого удаления. Плохая идея беспокоиться о пробелах в значениях полей идентификатора.

Ответ 10

Я хочу добавить этот ответ, потому что DBCC CHECKIDENT -approach будет проблемой продукта при использовании схем для таблиц. Используйте это, чтобы быть уверенным:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

Если вы хотите проверить успешность операции, используйте

SELECT IDENT_CURRENT(@Table);

который должен выводить 0 в приведенном выше примере.

Ответ 11

Как насчет этого?

ALTER TABLE 'table_name'
  MODIFY 'id' int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

Это быстрый и простой способ изменить автоинкремент на 0 или любое другое желаемое число. Я понял это, экспортировав базу данных и прочитав код самостоятельно.

Вы также можете написать это так, чтобы сделать это однострочным решением:

ALTER TABLE 'table_name' MODIFY 'id' int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;