【问题标题】:Compound IDENTITY column in SQL SERVER 2008SQL SERVER 2008 中的复合 IDENTITY 列
【发布时间】:2011-01-31 21:30:26
【问题描述】:
  • Orders 表有一个 CustomerId 列和一个 OrderId 列。
  • 出于某些原因,重要订单的 ID 不超过 2 个字节。
  • 总共会有几百万个订单,这使得 2 字节不足以容纳一个全局订单 ID。
  • 一个客户的订单不会超过几千个,2 字节就足够了。
  • 显而易见的解决方案是让 (CustomerId, CustomerOrderNumber) 是唯一的,而不是 OrderId 本身。

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

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

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

【问题讨论】:

  • OrderID 命名为CustomerOrderNumber 可能更好,因为它不会单独识别单个订单。
  • @OrbMan:你是对的。我已经改了。

标签: sql tsql sql-server-2008 identity identity-column


【解决方案1】:

试试这个:

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】:

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

    我认为这些方面应该为您做一些事情:

        ADD  CONSTRAINT [UQ_CustomerOrders] UNIQUE NONCLUSTERED 
    (
        [CustomerId] ASC,
        [OrderId] ASC,
    )
    

    【讨论】:

    • 每次插入时 OrderId 如何递增?
    • @AllenG:这是一个好的开始,但我如何确定下一个值?
    • 要创建新 ID,您可能需要 KM 的解决方案。我正在阅读的问题是 SQL2k8 如何确保组合是唯一的,同时允许在任一列中重复。
    • 好的。这也很有用。谢谢!
    【解决方案3】:

    这可能会对你有所帮助:Custom Auto-Generated Sequences with SQL Server

    【讨论】:

    • +1:它为任何此类选择的解决方案提供了几种好的方法和原则。
    猜你喜欢
    • 2015-09-01
    • 2013-05-10
    • 2012-03-31
    • 2012-12-18
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2015-03-05
    • 2011-09-12
    相关资源
    最近更新 更多