3
  • Orders 表有一个 CustomerId 列和一个 OrderId 列。
  • 由于某些原因,订单的 ID 不超过 2 个字节很重要。
  • 总共将有几百万个订单,这使得 2 个字节对于全局订单 ID 来说是不够的。
  • 一个客户将有不超过几千个订单,使得 2 字节就足够了。
  • 显而易见的解决方案是让 (CustomerId, CustomerOrderNumber) 是唯一的,而不是 OrderId 本身。

问题是生成下一个CustomerOrderId。最好不要为每个客户创建单独的表(即使它只包含一个 IDENTITY 列),以保持解决方案的上层简单。

问:如何生成下一个 OrderId 以使 (CustomerId, CustomerOrderId) 是唯一的,但允许 CustomerOrderNumber 本身有重复?Sql Server 2008 是否具有执行此操作的内置功能?

由于没有更好的术语,我将其称为 Compound IDENTITY 列。

4

3 回答 3

3

试试这个:

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 上有一个 unqiue 索引/约束

于 2010-03-25T19:23:23.997 回答
1

我会在 CustomerId 和 OrderId 的组合上设置唯一约束。

我认为这些方面的事情应该为你做:

    ADD  CONSTRAINT [UQ_CustomerOrders] UNIQUE NONCLUSTERED 
(
    [CustomerId] ASC,
    [OrderId] ASC,
)
于 2010-03-25T19:30:08.170 回答
0

这可能会对您有所帮助:使用 SQL Server 自定义自动生成的序列

于 2010-03-25T19:31:46.910 回答