SQL не увеличивает первичный ключ при ошибке INSERT - PullRequest
1 голос
/ 22 декабря 2010

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

Есть ли какая-то причина, почему SQL был разработан таким образом?И есть ли способ переопределить это поведение?

Я получаю доступ через Linq-to-SQL.

1 Ответ

6 голосов
/ 22 декабря 2010

это сделано для того, чтобы справиться с параллелизмом и сделать его максимально быстрым (что произойдет, если 3 вставки произойдут одновременно и 1 откатится ... это все испортит) ... когда вставка запускает sql Сервер определяет значение идентификатора. Если происходит откат, эти значения не используются повторно. На самом деле вы ничего не можете сделать, если не хотите запускать DBCC CHECKIDENT после каждого отката

Если вам нужен запрос, который идентифицирует пробелы, посмотрите на это Как вернуть все пропущенные значения идентификаторов из таблицы в SQL Server

Следующая версия SQL Server будет иметь sequences, которая может помочь вам с некоторыми из этих вещей, посмотрите здесь: Первый взгляд на последовательности в SQL Server Denali

...