我知道 IDENTITY 字段,但我感觉我无法使用它来解决我的问题。
假设我有多个客户。每个客户都有多个订单。每个客户都需要对其订单进行特定的顺序编号。
示例表结构:
Orders:
OrderID | ClientID | ClientOrderID | etc...
此表的一些示例行是:
OrderID | ClientID | ClientOrderID | etc...
1 | 1 | 1 | ...
2 | 1 | 2 | ...
3 | 2 | 1 | ...
4 | 3 | 1 | ...
5 | 1 | 3 | ...
6 | 2 | 2 | ...
我知道天真的方法是为任何客户端获取 MAX ClientOrderID 并将该值用于 INSERT,但这会受到并发问题的影响。我正在考虑使用事务,但我不太确定可用于此的最广泛的隔离范围是什么。我将使用 LINQ to SQL,但我觉得这不相关。
最佳答案
如果我错了,请有人纠正我,但是只要您的 MAX() 调用与您的插入在同一步骤中,您就不会遇到并发问题。
所以,你可以不做
select @newOrderID=max(ClientOrderID) + 1
from orders
where clientid=@myClientID;
insert into ( ClientID, ClientOrderID, ...)
values( @myClientID, @newOrderID, ...);
但是你可以做
insert into ( ClientID, ClientOrderID, ...)
select @myClientID, max(ClientOrderID) + 1, ...
from orders
where clientid=@myClientID;
我假设 OrderID 是一个标识列。
再说一次,如果我在这方面不正确,请告诉我。最好有一个 URL
关于sql-server-2005 - 我应该如何在 SQL Server 2005 中实现 "autonumber"字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675388/