удалить - Сбросить семя идентичности после удаления записей в SQL Server




удалить кортеж sql (12)

@jacob

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

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

Я вставил записи в таблицу базы данных SQL Server. В таблице был указан первичный ключ, а для семестра идентификации автоматического увеличения установлено значение «Да». Это делается в первую очередь потому, что в SQL Azure каждая таблица должна иметь первичный ключ и идентификатор.

Но поскольку мне нужно удалить некоторые записи из таблицы, семантику идентификации для этих таблиц будет нарушено, и столбец индекса (который автоматически генерируется с шагом 1) будет нарушен.

Как сбросить столбец идентификатора после удаления записей, чтобы столбец имел последовательность в порядке возрастания?

Столбец идентификатора не используется в качестве внешнего ключа в любой точке базы данных.


Во-первых: Спецификация идентичности Просто: «Нет» >> Сохранить проект реализации базы данных

После этого: Спецификация идентичности Просто: «ДА» >> Сохранить проект выполнения базы данных

Идентификатор вашей базы данных, ПК Начало от 1 >>


Для полных строк DELETE и сброса счетчика IDENTITY я использую это (SQL Server 2008 R2)

USE mydb

-- ##################################################################################################################
-- DANGEROUS!!!! USE WITH CARE
-- ##################################################################################################################

DECLARE
  db_cursor CURSOR FOR
    SELECT TABLE_NAME
      FROM INFORMATION_SCHEMA.TABLES
     WHERE TABLE_TYPE = 'BASE TABLE'
       AND TABLE_CATALOG = 'mydb'

DECLARE @tblname VARCHAR(50)
SET @tblname = ''

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @tblname

WHILE @@FETCH_STATUS = 0
BEGIN
  IF CHARINDEX('mycommonwordforalltablesIwanttodothisto', @tblname) > 0
    BEGIN
      EXEC('DELETE FROM ' + @tblname)
      DBCC CHECKIDENT (@tblname, RESEED, 0)
    END

  FETCH NEXT FROM db_cursor INTO @tblname
END

CLOSE db_cursor
DEALLOCATE db_cursor
GO

Запустите этот скрипт, чтобы сбросить столбец идентификатора. Вам нужно будет внести два изменения. Замените tableXYZ на любую таблицу, которую необходимо обновить. Кроме того, имя столбца идентификации нужно удалить из таблицы temp. Это было мгновенно на столе с 35 000 строк и 3 столбца. Очевидно, резервное копирование таблицы и сначала попробовать это в тестовой среде.

select * 
into #temp
From tableXYZ

set identity_insert tableXYZ ON

truncate table tableXYZ

alter table #temp drop column (nameOfIdentityColumn)

set identity_insert tableXYZ OFF

insert into tableXYZ
select * from #temp

Сбросить идентификационный столбец с новым идентификатором ...

DECLARE @MAX INT
SELECT @MAX=ISNULL(MAX(Id),0) FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED,@MAX)

Следует отметить, что ЕСЛИ все данные удаляются из таблицы с помощью предложения DELETE (т. WHERE Нет WHERE ), тогда до тех пор, пока разрешают ему разрешения), и b) нет FK, ссылающихся на таблицу (которая появляется в данном случае), использование TRUNCATE TABLE было бы предпочтительнее, поскольку оно делает более эффективное DELETE и одновременно сбрасывает семя IDENTITY . Следующие данные взяты на странице MSDN для TRUNCATE TABLE :

По сравнению с оператором DELETE TRUNCATE TABLE имеет следующие преимущества:

  • Меньшее пространство журнала транзакций используется.

    Оператор DELETE удаляет строки по одному и записывает запись в журнал транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только дезадаптации страниц в журнале транзакций.

  • Чаще всего используются замки.

    Когда оператор DELETE выполняется с помощью блокировки строк, каждая строка в таблице блокируется для удаления. TRUNCATE TABLE всегда блокирует таблицу (включая блокировку схемы (SCH-M)) и страницу, но не каждую строку.

  • Без исключения в таблице остаются нулевые страницы.

    После выполнения инструкции DELETE таблица может содержать пустые страницы. Например, пустые страницы в куче не могут быть освобождены без по крайней мере исключительной (LCK_M_X) блокировки таблицы. Если операция удаления не использует блокировку таблицы, таблица (куча) будет содержать много пустых страниц. Для индексов операция удаления может оставлять пустые страницы позади, хотя эти страницы будут быстро освобождены путем очистки фона.

Если таблица содержит столбец идентификатора, счетчик для этого столбца сбрасывается на начальное значение, определенное для столбца. Если семя не было определено, используется значение по умолчанию 1. Чтобы сохранить счетчик идентификаторов, вместо этого используйте DELETE.

Итак, следующее:

DELETE FROM [MyTable];
DBCC CHECKIDENT ('[MyTable]', RESEED, 0);

Становится справедливым:

TRUNCATE TABLE [MyTable];

Дополнительную информацию об ограничениях см. В документации TRUNCATE TABLE (см. Выше).


Хотя большинство ответов предполагают RESEED равным 0, но много раз нам нужно просто переместиться в следующий Id

declare @max int
select @max=max([Id])from [TestTable]
if @max IS NULL   //check when max is returned as null
  SET @max = 0
DBCC CHECKIDENT ('[TestTable]', RESEED,@max)

Это проверит таблицу и вернется к следующему идентификатору.


Хотя большинство ответов указывают на RESEED на 0 , а некоторые считают это недостатком для таблиц TRUNCATED , у Microsoft есть решение, исключающее ID

DBCC CHECKIDENT ('[TestTable]', RESEED)

Это проверит таблицу и вернется к следующему ID . Это было доступно с MS SQL 2005 до текущего.

MSDN


Я попробовал ответить @anil shahs и сбросил личность. Но когда новая строка была вставлена, она получила identity = 2 . Поэтому вместо этого я изменил синтаксис на:

DELETE FROM [TestTable]

DBCC CHECKIDENT ('[TestTable]', RESEED, 0)
GO

Тогда первая строка получит идентификатор = 1.


выдача команды 2 может сделать трюк

DBCC CHECKIDENT ('[TestTable]', RESEED,0)
DBCC CHECKIDENT ('[TestTable]', RESEED)

первый сброс идентификатора до нуля, а следующий будет установлен на следующее доступное значение - jacob


DBCC CHECKIDENT (<TableName>, reseed, 0)

Это установит текущее значение идентичности равным 0.

При вставке следующего значения значение удостоверения возрастает до 1.


DBCC CHECKIDENT ('TestTable', RESEED, 0)
GO

Где 0 - identity Начальное значение







azure-sql-database