глобально уникальный целочисленный идентификатор (последовательный) для заданного местоположения - PullRequest
0 голосов
/ 01 октября 2008

Мне нужно создать уникальный идентификатор для данного местоположения, и идентификатор местоположения должен быть последовательным. Таким образом, он в основном похож на первичный ключ, за исключением того, что он также привязан к locationID. Таким образом, 3 различных местоположения будут иметь идентификаторы, такие как 1,2,3,4,5, ..., n

Каков наилучший способ сделать это? Мне также нужен безопасный способ получения nextID для данного местоположения, я полагаю, я могу просто поместить транзакцию в хранимую процедуру, которая получает следующий идентификатор?

Ответы [ 3 ]

2 голосов
/ 01 октября 2008

Один из способов, с помощью которых я видел это, - создание таблицы, отображающей местоположение на следующий идентификатор.

CREATE TABLE LocationID {
    Location varchar(32) PRIMARY KEY,
    NextID int DEFAULT(1)
}

Внутри вашей хранимой процедуры вы можете выполнить обновление и получить текущее значение, одновременно увеличивая значение:

...
UPDATE LocationID SET @nextID = NextID, NextID = NextID + 1 WHERE Location = @Location
...

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

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

1 голос
/ 01 октября 2008

Вам понадобится обернуть код, чтобы найти следующий идентификатор, и код, чтобы сохранить строку в той же транзакции. Вы не хотите (псевдокод):

transaction {
   id = getId
}

... other processing

transaction {
   createRowWithNewId
}

Поскольку другой объект с таким идентификатором может быть сохранен во время "... другой обработки"

0 голосов
/ 30 июня 2017

Если это не нужно сохранять, вы всегда можете сделать это в своем запросе вместо сохранения в самой таблице.

select
  locationID
  ,row_number() over (partition by locationID order by (select null)) as LocationPK
From
  YourTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...