Я удалил некоторые записи из таблицы в базе данных SQL Server. Теперь идентификатор идет от 101 до 1200. Я хочу снова удалить записи, но я хочу, чтобы ID вернулся к 102. Есть ли способ сделать это в SQL Server?
Reset Автоинкремент в 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
Ответ 3
полу-идиот-доказательство:
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
Ответ 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;