Я удалил некоторые записи из таблицы в базе данных SQL Server. Теперь идентификатор изменяется с 101 на 1200. Я хочу снова удалить записи, но хочу, чтобы идентификаторы вернулись к 102. Есть ли способ сделать это в SQL Server?
Я удалил некоторые записи из таблицы в базе данных SQL Server. Теперь идентификатор изменяется с 101 на 1200. Я хочу снова удалить записи, но хочу, чтобы идентификаторы вернулись к 102. Есть ли способ сделать это в SQL Server?
Ответы:
Выполните следующую команду для повторного заполнения mytable, чтобы начать с 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
Об этом читайте в Книгах онлайн (BOL, справка по SQL). Также будьте осторожны, чтобы у вас не было записей выше, чем семена, которые вы устанавливаете.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
если число = 0, то при следующей вставке поле автоинкремента будет содержать значение 1
если число = 101, то при следующей вставке поле автоинкремента будет содержать значение 102
Некоторая дополнительная информация ... Может быть полезна для вас
Перед тем, как задать автоинкремент number
в вышеприведенном запросе, вы должны убедиться, что столбец автоинкрементации в вашей существующей таблице содержит значения меньше этого number
.
Чтобы получить максимальное значение столбца (column_name) из таблицы (table1), вы можете использовать следующий запрос
SELECT MAX(column_name) FROM table1
полу идиот-доказательство:
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
Если вы используете MySQL, попробуйте это:
ALTER TABLE tablename AUTO_INCREMENT = 1
Удалить и восстановить все таблицы в базе данных.
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.
На основании принятого ответа для тех, кто столкнулся с подобной проблемой, с полной квалификацией схемы:
( [MyDataBase].[MySchemaName].[MyTable]
) ... приводит к ошибке, вы должны быть в контексте этой БД
То есть следующее выдаст ошибку:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Вместо этого заключите полное имя таблицы в одинарные кавычки:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
Несколько ответов рекомендуют использовать утверждение примерно так:
DBCC CHECKIDENT (mytable, RESEED, 0)
Но ОП сказал «удалил некоторые записи», что может быть не все из них, поэтому значение 0 не всегда является правильным. В другом ответе предлагалось автоматически найти максимальное текущее значение и пересчитать его, но это приведет к проблемам, если в таблице нет записей, и, следовательно, max () вернет NULL. Комментарий предложил использовать просто
DBCC CHECKIDENT (mytable)
сбросить значение, но другой комментарий правильно заявил, что это только увеличивает значение до максимума уже в таблице; это не уменьшит значение, если оно уже выше максимального значения в таблице, что и хотел сделать ОП.
Лучшее решение объединяет эти идеи. Первый CHECKIDENT сбрасывает значение до 0, а второй сбрасывает его до самого высокого значения в настоящее время в таблице, если в таблице есть записи:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Как указано в нескольких комментариях, убедитесь, что в других таблицах нет внешних ключей, указывающих на удаленные записи. В противном случае эти внешние ключи будут указывать на записи, которые вы создаете после повторного заполнения таблицы, что почти наверняка не соответствует вашим ожиданиям.
Я хочу добавить этот ответ, потому что DBCC CHECKIDENT
-approach создаст проблемы с продуктом при использовании схем для таблиц. Используйте это, чтобы быть уверенным:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
Если вы хотите проверить успешность операции, используйте
SELECT IDENT_CURRENT(@Table);
который должен выводиться 0
в примере выше.
Вы не хотите делать это в целом. Reseed может создать проблемы с целостностью данных. Это действительно только для использования в системах разработки, где вы стираете все тестовые данные и начинаете заново. Его не следует использовать в производственной системе, если все связанные записи не были удалены (не каждая таблица, которая должна быть связана с внешним ключом!). Делая это, вы можете создать беспорядок, особенно если вы хотите делать это регулярно после каждого удаления. Не стоит беспокоиться о пробелах в значениях полей идентичности.
Как насчет этого?
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;