sql-server-2005 - 我应该如何在 SQL Server 2005 中实现 "autonumber"字段?

标签 sql-server-2005 transactions identity auto-increment transaction-isolation

我知道 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/

相关文章:

sql - 将主键用作身份字段是否很好

sql-server-2005 - 键值表上的 SQL Server PIVOT

SQL Server 2005 将 VARCHAR 转换为 INT 但默认为无效类型

java - 防止事务标记为回滚

authentication - Saml2AuthenticationModule 类去了哪里?

php - 使用 PHP - PayPal 设置即时付款通知

sql-server-2005 - 微软 SQL Server 2005 : Error log is too big and getting bigger

sql - 'sp_executesql' 附近的语法不正确

hibernate - JBoss TreeCache 作为二级 Hibernate 缓存的并发策略配置

spring - PROPAGATION_NESTED vs PROPAGATION_ Spring 需要吗?