измените значение столбца идентификаторов в sql server

#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.