Замените MSSQL-идентификатор автоинкремента регулярной последовательностью - PullRequest
0 голосов
/ 29 октября 2019

Для меня неожиданно возникла проблема с тем, что столбец идентификатора автоинкремента MSSQL-сервера работает не так, как я ожидал.

Это не гарантирует последовательную последовательность. Я имею в виду, что если он идет как 1, 2, 3, 4, 5, то если вы перезапустите сервер, он может легко продолжить как 10006, 10007, 10008, 10009, 10010. Если у вас есть некоторые документы, сгенерированные с этими номерами (скажем, контракты), это может привести к ситуации, когда у вашей компании были контракты с номерами 1, 2, 3, 4, 5, а затем случайно было изменено на 10006, 10007, 10008, 10009, 10010.

На других RDBM автостолбец -increment всегда сохраняет согласованность, и не имеет значения, перезапустили ли вы его или нет.

Так что теперь я хочу изменить этот столбец, чтобы он обслуживался последовательностью. Вопрос в том, как сделать это максимально плавно? Я использую Entity Framework и его механизм миграции.

Столбец определен как:

CREATE TABLE [dbo].[
    -- omitted for the sake of brevity
    [CompanyNo] [bigint] IDENTITY(1,1) NOT NULL
    -- omitted for the sake of brevity
);

Лучше всего создать миграцию:

  1. Получениетекущее последнее значение столбца CompanyNo
  2. Изменение столбца без автоматического увеличения
  3. Создание последовательности с начальным значением того, что было на шаге 1

Технологии:

  • Entity Framework 6 + Миграции + Первый код
  • MSSQL
  • ASP.NET MVC

1 Ответ

1 голос
/ 29 октября 2019

Мое предложение состоит в том, чтобы добавить в таблицу столбец отметки времени, который логически записывает, когда данная запись была добавлена. Затем, когда вы захотите сгенерировать вашу последовательность, вы можете сделать это на лету, используя ROW_NUMBER:

SELECT *, ROW_NUMBER() OVER (ORDER BY ts_col) seq
FROM yourTable;

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

...