Добавьте столбец uniqueidentifier в таблицу со значением по умолчанию NEWID (). Это гарантирует, что каждый столбец получит новый уникальный идентификатор, который не является инкрементным.
CREATE TABLE MyTable (
...
PIN uniqueidentifier NOT NULL DEFAULT newid()
...
)
Уникальный идентификатор гарантированно будет уникальным не только для этой таблицы, но и для всех таблиц.
Если он слишком велик для вашего приложения, вы можете получить меньший PIN-код из этого номера, вы можете сделать это следующим образом:
SELECT RIGHT(REPLACE((SELECT PIN from MyTable WHERE UserID=...), '-', ''), 4/*PinLength*/)
Обратите внимание, что возвращенный меньший PIN-код не обязательно будет уникальным для всех пользователей, но может быть более управляемым, в зависимости от вашего приложения.
РЕДАКТИРОВАТЬ: Если вам нужен маленький ПИН-код с гарантированной уникальностью, сложная часть заключается в том, что вам необходимо знать как минимум максимальное количество пользователей, чтобы выбрать подходящий размер пина. По мере увеличения количества пользователей увеличивается вероятность конфликта ПИН-кодов. Это похоже на проблему Coupon Collector и приближается к n log n сложности, что приведет к очень медленным вставкам (время вставки пропорционально количеству существующих элементов, поэтому вставка M элементов становится O (N ^ 2) )). Самый простой способ избежать этого - использовать большой уникальный идентификатор и выбрать только его часть для своего PIN-кода, при условии, что вы можете отказаться от уникальности значений PIN-кода.
РЕДАКТИРОВАТЬ2:
Если у вас есть такое определение таблицы
CREATE TABLE YourTable (
[id] [int] IDENTITY(1,1) NOT NULL,
[pin] AS (CONVERT(varchar(9),id,0)+RIGHT(pinseed,3)) PERSISTED,
[pinseed] [uniqueidentifier] NOT NULL
)
Это создаст pin
из pinseed
уникального идентификатора и идентификатора строки. (RAND не работает - поскольку SQL-сервер будет использовать одно и то же значение для инициализации нескольких строк, это не относится к NEWID ())
Просто чтобы было сказано, я советую вам не считать это каким-либо образом безопасным. Всегда следует учитывать, что другой пользователь может угадать чужой PIN-код, если только вы не ограничите количество разрешенных предположений (например, прекратите принимать запросы после 3 попыток, как если бы банк удерживал вашу карту после 3 неправильных вводов PIN).