Автоинкрементная колонка varchar опционально - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть таблица с идентификатором guid и одним полем, которое представляет собой строку из 5 символов, которая может быть указана пользователем, но это необязательно, и она должна быть уникальной для каждого пользователя. Я ищу способ, чтобы это поле всегда было там, даже если пользователь не указал его. Самый простой подход состоит в том, чтобы иметь его как «00001», «00002» ... и т. Д. В случае, если пользователь не указывает его, он сохраняется следующим образом. Я использую SQL и ядро ​​Entity Framework. Каков наилучший способ добиться этого?

РЕДАКТИРОВАТЬ: может быть, триггер, который будет проверять после вставки, если это поле не указано, а затем просто взять текущий номер строки и преобразовать его в строку? Имеет ли это смысл? Приветствия

1 Ответ

0 голосов
/ 14 ноября 2018

Установка значения по умолчанию '00001' может быть выполнена, определив поле с помощью:
NOT NULL DEFAULT right('0000' || to_char(SomeSequence.nextval),5) (псевдокод для адаптации к СУБД, к которой вы подключены).
По сравнению с решением в вашей EDIT, это как минимум гарантирует, что 2 вставки одновременно от 2 разных пользователей получат разные значения.

Настоящая проблема связана с ограничением unique на столбец. Это плохо работает при смешивании ручного ввода с вычисленными значениями.
Если как пользователь я ввожу (вручную) 00005, то вставка завершится неудачей, когда SomeSequence достигнет 5.

Я думаю, что эта проблема будет существовать независимо от того, как вы реализуете генерацию значений (последовательность, триггер, внешний код, ...)
Даже если вы справляетесь с кодированием некоторой дополнительной (и, вероятно, сложной) логики для управления этим, это, вероятно, уменьшит параллелизм.

...