#sql-server #reset #identity-column
#sql-сервер #Сброс #идентификатор-столбец
Вопрос:
Пожалуйста, помогите мне! У меня есть таблица, в поле identity значение которой равно, например, 1, 2, 4, 6, 8, 10, 11 …. и т.д.
Я хочу сделать это в последовательности, то есть 1,2,3,4,5,6,7 … без использования drop
Спасибо
Комментарии:
1. в дополнение к приведенным ниже ответам, этому полю identity не должно быть придано никакого значения, кроме как для уникальной идентификации записи. Это не должен быть номер накладной, номер упаковки или любой другой номер, который что-то для кого-то значит.
2. Почему вы хотите это сделать?
Ответ №1:
Вы не можете. identity
столбцы не подлежат обновлению. (или, по крайней мере, вы не можете никаким разумным способом. Вы могли бы удалить все строки из таблицы, а затем повторно вставить их с помощью IDENTITY_INSERT
on)
Кроме того, пробелы в identity
столбцах — это просто жизненный факт, с которым лучше смириться! Если вам нужна непрерывная последовательность чисел для целей отображения, вы можете использовать ROW_NUMBER
.
Комментарии:
1. Идентификаторы всегда будут иметь пробелы, они расходуются для каждой записи, которая откатывается, а также для записей, которые позже удаляются.
Ответ №2:
Простого способа сделать это нет, и нет причин, по которым вы должны это делать. Однако вы могли бы сконструировать представление для обеспечения аналогичной функциональности:
CREATE VIEW MyTableView AS SELECT ROW_NUMBER() OVER (ORDER BY Identity) AS RowNum, * FROM MyTable
а затем попросите ваших клиентов выбрать из MyTableView вместо этого.
Если вам нужно, чтобы представление имело то же имя, что и таблица, чтобы обеспечить обратную совместимость, вы, конечно, можете переименовать свою таблицу, а затем создать представление со старым именем таблицы.
Комментарии:
1. Упс. Полностью неверно истолковал вопрос, теперь ответ должен быть исправлен.
Ответ №3:
Почему бы вам не создать новое поле, сделать его начальным значением identity, начиная с 1, а затем удалить старый столбец и переименовать новый столбец (а затем воссоздать все ваши ссылки FK).
Комментарии:
1. SQL Server не позволяет изменять свойство identity для столбцов. Вам нужно будет удалить весь исходный столбец и создать новый столбец identity. Не было бы особой гарантии, что новый порядок соответствует старому.
2. @Martin — неверно. Через пользовательский интерфейс в SQL Server 2005/2008 manager вы можете изменить столбец, удалив свойство autonumber (identity) столбца (выберите таблицу, щелкнув по ней правой кнопкой мыши, и выберите «Дизайн»).
3. Это фактически перестраивает всю таблицу за кулисами. Щелкните значок «Скрипт» на панели инструментов, чтобы увидеть SQL, который он генерирует.
4. @Martin — ты прав :(. Я думал, что отчетливо запомнил скрипт для отображения инструкции ‘alter column’, но я ошибался.
Ответ №4:
Я думаю, что это лучшее решение.. попробуйте, если вам это нравится…
DECLARE @INC AS INTEGER
SET @INC = 1
WHILE (@INC <= 7582) --7582 is rowcount of table
BEGIN
UPDATE YourTable
SET ID = @INC
WHERE ID = (
SELECT MIN(ID) AS T
FROM YourTable
WHERE ID > @INC
) --ID=> Identity column
SET @INC = @INC 1
END
Примечание: перед выполнением этого вам необходимо удалить вставку identity в столбец.
Ответ №5:
DBCC CHECKIDENT (<‘Имя таблицы’>, ПОВТОРНО ВВЕСТИ, <‘последняя последовательность в таблице **’>)
** при вводе это число будет равно плюс 1 ( 1). т. Е. для новой записи требовалось, чтобы следующим было 38, поэтому в качестве этого значения использовалось 37.