it-swarm.com.ru

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

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

231
jumbojs

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

DBCC CHECKIDENT (mytable, RESEED, 0)

Об этом читайте в Книгах онлайн (BOL, справка по SQL). Также будьте осторожны, чтобы у вас не было записей выше, чем семена, которые вы устанавливаете.

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

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

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


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

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

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

 SELECT MAX(column_name) FROM table1
79
Fathah Rehman P

полу идиот-доказательство:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete

34
user423430

Попробуй это:

ALTER TABLE tablename AUTO_INCREMENT = 1
9
xaa

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

    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.
6
BMG

Я понял. Это:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
6
jumbojs

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

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

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

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

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

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

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

DBCC CHECKIDENT (mytable, RESEED, 0)

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

DBCC CHECKIDENT (mytable)

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

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

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

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

3
Michael Rodby

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

2
HLGEM

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

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

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

SELECT IDENT_CURRENT(@Table);

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

2
Alexander Schmidt

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

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;
0
Victor Resnov