Создайте инкрементный номер на основе другого столбца для формирования ключа из двух частей - PullRequest
2 голосов
/ 18 июля 2011

У меня есть таблица в базе данных SQL Server.Он состоит из двух частей: натуральный ключ Location (целое число) и CaseNumber (также целое число).Когда я создаю новую запись, я хочу указать местоположение и сгенерировать для меня CaseNumber, чтобы в любом месте все номера дел были уникальными, с приращением и без пробелов.Записи в таблице никогда не будут удалены.

Каков наилучший способ сделать это, обеспечив безопасность для одновременных обновлений?

1 Ответ

0 голосов
/ 18 июля 2011

Это было рассмотрено ранее, но вот некоторые общие идеи:

Добавить UNIQUE INDEX покрытие Location, CaseNumber. Это предотвратит дуплексы в случае сбоя проверки параллелизма.

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

... * то есть 1009 *

DECLARE @Max int
BEGIN TRAN
SET @Max = (SELECT MAX(CaseNumber) FROM MyTable WITH (TABLOCK) 
            WHERE Location = @Location) + 1

INSERT INTO MyTable
@Location, @Max

COMMIT TRAN
...