English 中文(简体)
Compound IDENTITY column in SQL SERVER 2008
原标题:
  • An Orders table has a CustomerId column and an OrderId column.
  • For certain reasons it s important that an order s id is no longer than 2-bytes.
  • There will be several million orders in total, which makes 2-bytes not enough for a global order id.
  • A customer will have no more than several thousand orders making 2-bytes enough.
  • The obvious solution is to have the (CustomerId, CustomerOrderNumber) be unique rather than OrderId itself.

The problem is generating the next CustomerOrderId. Preferably, without creating a separate table for each customer (even if it contains only an IDENTITY column), in order to keep the upper layers of the solution simple.

Q: how would you generate the next OrderId so that (CustomerId, CustomerOrderId) is unique but CustomerOrderNumber itself is allowed to have repetitions? Does Sql Server 2008 have a built in functionality for doing this?

For lack of a better term I m calling it a Compound IDENTITY column.

最佳回答

try this:

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

make sure you have a unqiue index/constraint on CustomerId ,OrderId

问题回答

I would set a Unique Constraint on the combination of CustomerId and OrderId.

I thing something along these lines should do for you:

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




相关问题
How to write this T-SQL WHERE condition?

I ve got two tables: TableA Col1 Col2 TableB Col3 Col4 I want to join them together: SELECT * from TableA join TableB ON (...) Now, in place of ... I need to write an expression ...

Customer and Order Sql Statement

TSQL query to select all records from Customer that has an Order and also select all records from customer that does not have an Order. The table Customer contains a primary key of CustomerID. The ...

Recommended way of querying multiple Versioned tables

Have a win 2003 box with MSSQL 2005 running on it. There is a database which is populated every morning with new/modified SalesOrder made the previous day. The database has several tables: SalesOrder, ...

update duplicate record

I have a table with the following fields Id Name IsPublic i need to write a sql query that updates IsPublic to false where name has a duplicate. Only one of the duplicates should have IsPublic = ...

Define variable to use with IN operator (T-SQL)

I have a Transact-SQL query that uses the IN operator. Something like this: select * from myTable where myColumn in (1,2,3,4) Is there a way to define a variable to hold the entire list "(1,2,3,4)"? ...

Selecting records during recursive stored procedure

I ve got a content management system that contains a hierarchical structure of categories, with sub-categories subject to different ordering options at each level. Currently, that s retrieved by a (...

热门标签