SQL Последовательности для Создания Уникальных Значений
Для создания уникального номера, например заказа в системе продаж, вы можете:
- использовать автогенерацию первичного ключа из базы данных,
- выбирать максимальный номер заказа из базы и добавлять единицу,
- использовать свой код, генерирующий уникальные числа.
– использовать SQL-последовательность.
Последовательность (sequence) - простой и эффективный способ создания уникальных упорядоченных значений потокобезопасным способом.
SQL код для создания очень прост:
CREATE SEQUENCE TestSeqНачальный номер и число инкремента могут быть любыми.
START WITH 1
INCREMENT BY 1
Выбрать следующее значение можно так:
SELECT NEXT VALUE FOR TestSeqEntity Framework также поддерживает последовательности… ну, более-менее. Создать последовательность можно в
OnModelCreating вашего DbContext:protected override void OnModelCreating(ModelBuilder mb)А вот простого метода получения следующего значения нет. Большинство документации сводится к использованию значения по умолчанию через вот такую конструкцию:
{
mb.HasSequence("TestSeq",
x => x.StartsAt(1000).IncrementsBy(2));
…
mb.Entity<Order>()Ограничения
.Property(o => o.OrderNo)
.HasDefaultValueSql("NEXT VALUE FOR TestSeq");
При принятии решения об использовании последовательностей, необходимо иметь в виду некоторые их ограничения:
1. Когда вы запрашиваете число, независимо от того, что происходит с этого момента, последовательность увеличивается. Последовательности не являются частью транзакций. Если вы откатите транзакцию с выбранным числом последовательности, это число «потеряется».
2. Последовательности не могут быть «разделены» каким-либо образом. Если вам требуется генерировать уникальные номера в течение года, а с 1 января «сбрасывать» нумерацию, вы не сможете создать заказ «задним числом». 1 января последовательность сбросится, и получить номер для заказа от 31 декабря прошлого года не удастся. Вариант решения – иметь несколько последовательностей на текущий год и несколько предыдущих, в которых ещё требуется продолжать нумерацию.
3. Аналогично если нескольким потребителям требуется отдельная нумерация, для каждого придётся создать свою последовательность.
Итого
Последовательности хороши, когда вам нужно приращение на одно и то же число для вашей базы данных с одним потребителем. Для более сложного функционала придётся придумывать что-то нестандартное или иметь дело с управлением несколькими последовательностями одновременно и выбором правильной в нужное время с помощью бизнес-логики.
Источник: https://dotnetcoretutorials.com/2022/03/22/using-sql-server-sequences-to-generate-unique-values/