среда, 3 июня 2009 г.

Как сбросить Identity в MS Sql

Если у Вас в таблице есть поле с автоинкрементном (Identity), то при удалении строк из таблицы нумерация все равно продолжается с последнего числа.

Есть несколько вариантов решения этой проблемы.

1. DBCC CHECKIDENT
Это самый простой вариант, просто устанавливаете желаемое значение. Будьте осторожны, не установите значение меньше, чем последнее.

DBCC CHECKIDENT (<table name>,RESEED,<new value>)

2. Удалить и добавить поле
Это более безопасный вариант т.к. новые значения присваиваются автоматически, но требует большего количества действий и меняет порядок столбцов.

ALTER TABLE <table name> DROP CONSTRAINT <constraint name>

ALTER TABLE <table name> DROP COLUMN <column name>

ALTER TABLE <table name> ADD <column name> bigint identity (1,1) NOT NULL

ALTER TABLE <table name> ADD CONSTRAINT <constraint name> PRIMARY KEY CLUSTERED(<column name> ASC)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

3. Удалить и создать таблицу
Этот вариант устанавливает новое безопасное значение и сохраняет порядок колонок.

Создайте новую временную таблицу с такой же структурой, скопируйте все данные во временную таблицу, удалите старую таблицу и переименуйте временную.

Выбор подходящего варианта остается за вами.

3 комментария:

  1. пригодилось первое

    ОтветитьУдалить
  2. Первое удобнее всего. Но хотя бы пару раз на тестовой базе попробовать не мешает

    ОтветитьУдалить
  3. -- ПРОЦЕДУРА ДЛЯ УДАЛЕНИЯ КАТЕГОРИИ
    CREATE PROCEDURE CATEGORIA
    @IDCATEGORIA INT
    AS
    DELETE CATEGORIA
    WHERE IDCATEGORIA = @IDCATEGORIA
    -- Обнуляем счетчик после удаления строки из таблицы
    select @IDCATEGORIA=max([IDCATEGORIA])from [CATEGORIA]
    if @IDCATEGORIA IS NULL
    SET @IDCATEGORIA = 0
    DBCC CHECKIDENT ('[CATEGORIA]', RESEED, @IDCATEGORIA)

    вот мой вариант и не партесь....

    ОтветитьУдалить