Помогите с заявлением sql - PullRequest
       3

Помогите с заявлением sql

0 голосов
/ 11 октября 2010

Я хочу гарантировать, что токен назначен заказу. Все доступные токены находятся внутри таблицы токенов, и каждый токен может быть ТОЛЬКО назначен 1 заказу. Вот sql, который я придумал:

SET XACT_ABORT ON;
BEGIN TRANSACTION

-- Reserve token.
SELECT @token = token, @tokenId = id FROM Tokens WITH (UPDLOCK) WHERE taken = 0;
-- Take token.
UPDATE Tokens SET taken = 1 WHERE id = @tokenId;
-- Assign token to the order.
UPDATE Orders SET token = @token WHERE ID = @orderId;

COMMIT TRANSACTION

Может ли приведенный выше код гарантировать, что

  1. если в таблице токенов есть доступный токен, он будет выбран и назначен для заказа.
  2. каждый токен не будет назначен более чем на 1 заказ.
  3. Оператор никогда не завершится ошибкой.

Видите ли вы другие потенциальные проблемы с этим утверждением?

1 Ответ

2 голосов
/ 11 октября 2010

Вместо enter code here «занято» атрибута, почему бы просто не добавить обнуляемый OrderId в таблицу токенов.Это выполняет ваши цели только с одним атрибутом столбца.

Update Tokens SET 
  Orderid = @orderId  
Where tokenId = (Select Min(TokenId)
                 From Tokens
                 Where Orderid is Null)

РЕДАКТИРОВАТЬ: добавлена ​​схема для иллюстрации отношения один к нулю или одного

Tokens
TokenId integer non-null PK
... other attributes
enter code here


Orders
OrderId Integer Non-Null PK, FK to Tokens.TokenId
... other attributes

Теперь все, что вам нужно сделать, это использовать доступный идентификатор токена из таблицы токенов при созданииновая запись заказов.

Insert Orders (OrderId, [Other attributes])
Select Min(TokenId), [Other values]
From Tokens t
Where Not Exists
  (Select * From Orders
   Where OrderId = t.TokenId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...