День 1211. #ЗаметкиНаПолях
SQL Последовательности для Создания Уникальных Значений
Для создания уникального номера, например заказа в системе продаж, вы можете:
- использовать автогенерацию первичного ключа из базы данных,
- выбирать максимальный номер заказа из базы и добавлять единицу,
- использовать свой код, генерирующий уникальные числа.
– использовать SQL-последовательность.
Последовательность (sequence) - простой и эффективный способ создания уникальных упорядоченных значений потокобезопасным способом.
SQL код для создания очень прост:
CREATE SEQUENCE TestSeq
START WITH 1
INCREMENT BY 1
Начальный номер и число инкремента могут быть любыми.
Выбрать следующее значение можно так:
SELECT NEXT VALUE FOR TestSeq
Entity 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. Аналогично если нескольким потребителям требуется отдельная нумерация, для каждого придётся создать свою последовательность.
Итого
Последовательности хороши, когда вам нужно приращение на одно и то же число для вашей базы данных с одним потребителем. Для более сложного функционала придётся придумывать что-то нестандартное или иметь дело с управлением несколькими последовательностями одновременно и выбором правильной в нужное время с помощью бизнес-логики.
Источник: dotnetcoretutorials.com/2022/03…e-values