Составной столбец IDENTITY в SQL SERVER 2008 - PullRequest
3 голосов
/ 25 марта 2010
  • Таблица заказов имеет столбец CustomerId и столбец OrderId.
  • По определенным причинам важно , чтобы идентификатор заказа не превышал 2 байта.
  • Всего будет несколько миллионов заказов, что делает 2 байта недостаточно для глобального идентификатора заказа.
  • У клиента будет не более нескольких тысяч заказов с объемом в 2 байта.
  • Очевидное решение состоит в том, чтобы (CustomerId, CustomerOrderNumber) был уникальным, а не сам OrderId.

Проблема в создании next CustomerOrderId. Желательно, не создавая отдельную таблицу для каждого клиента (даже если она содержит только столбец IDENTITY), чтобы верхние уровни решения были простыми.

Q: как бы вы сгенерировали следующий OrderId, чтобы (CustomerId, CustomerOrderId) был уникальным, а самому CustomerOrderNumber разрешалось иметь повторы? Есть ли в Sql Server 2008 встроенная функциональность для этого?

Из-за отсутствия лучшего термина я называю это столбцом Compound IDENTITY.

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

попробуйте это:

DECLARE @Output table (orderID smallint)  --smallint=2 bytes

BEGIN TRANSACTION

INSERT INTO ORDERS
        (CustomerId ,OrderId ,.....)
        OUTPUT INSERTED.OrderId 
        INTO @Output 
    SELECT
        @CustomerId ,ISNULL(MAX(OrderId),0)+1, @...
        FROM ORDERS WITH (UPDLOCK,HOLDLOCK)
        WHERE CustomerId=@CustomerId 

--any other processing, can use just generated @Output.OrderId value if necessary

COMMIT

убедитесь, что у вас есть уникальный индекс / ограничение на CustomerId, OrderId

1 голос
/ 25 марта 2010

Я бы установил уникальное ограничение на комбинацию CustomerId и OrderId.

Я должен кое-что сделать для вас:

    ADD  CONSTRAINT [UQ_CustomerOrders] UNIQUE NONCLUSTERED 
(
    [CustomerId] ASC,
    [OrderId] ASC,
)
0 голосов
/ 25 марта 2010
...