代码之家  ›  专栏  ›  技术社区  ›  Asaf R

sql server 2008中的复合标识列

  •  3
  • Asaf R  · 技术社区  · 15 年前
    • orders表有一个customerid列和一个orderid列。
    • 出于某些原因 重要的 订单的id不超过2个字节。
    • 总共将有几百万个订单,这使得2字节不足以作为全局订单ID。
    • 一个客户的订单将不超过几千个,只需2字节。
    • 显而易见的解决方案是(customerID,customerOrderNumber)是唯一的,而不是orderID本身。

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

    问: 如何生成下一个orderID,以便(customerID,customerOrderID)是唯一的,但customerOrderNumber本身允许重复?SQL Server 2008是否有用于执行此操作的内置功能?

    由于缺少更好的术语,我称之为复合标识列。

    3 回复  |  直到 15 年前
        1
  •  3
  •   KM.    15 年前

    试试这个:

    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索引/约束

        2
  •  1
  •   AllenG    15 年前

    我将对customerid和orderid的组合设置一个唯一的约束。

    我觉得应该为你做点什么:

        ADD  CONSTRAINT [UQ_CustomerOrders] UNIQUE NONCLUSTERED 
    (
        [CustomerId] ASC,
        [OrderId] ASC,
    )
    
        3
  •  0
  •   Mladen Prajdic    15 年前