基于另一列创建递增数字以形成两部分键

发布于 2024-11-24 05:25:22 字数 180 浏览 2 评论 0原文

我在 SQL Server 数据库中有一个表。它在 Location(一个整数)和 CaseNumber(也是一个整数)上有一个由两部分组成的自然键。当我创建一条新记录时,我想指定位置并为我生成案例编号,以便对于任何一个位置,所有案例编号都是唯一的、递增的且没有间隙。表中的记录永远不会被删除。

确保并发更新安全的最佳方法是什么?

I have a table in a SQL Server database. It has a two-part natural key on Location (an integer) and CaseNumber (also an integer). When I create a new record I want to specify the Location and have the CaseNumber generated for me so that for any one location all Case Numbers are unique, incrementing and without gaps. Records in the table will never be deleted.

What would be the best way to do this ensuring that it is safe for concurrent updates?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谈下烟灰 2024-12-01 05:25:22

这一点之前已经介绍过,但这里有一些一般性的想法:

添加一个涵盖 Location, CaseNumberUNIQUE INDEX。如果并发检查失败,这将防止受骗。

封装用于在事务中检查/插入新最大值的代码。它并不漂亮,但它可以确保不会出现并发问题。

IE..

DECLARE @Max int
BEGIN TRAN
SET @Max = (SELECT MAX(CaseNumber) FROM MyTable WITH (TABLOCK) 
            WHERE Location = @Location) + 1

INSERT INTO MyTable
@Location, @Max

COMMIT TRAN

This has been covered before, but here are some general ideas:

Add a UNIQUE INDEX covering Location, CaseNumber. This will prevent dupes should your concurrency checks fail.

Encapsulate your code for checking/inserting the new max value in a transaction. It's not pretty but its how you can insure there won't be issues with concurrency.

i.e...

DECLARE @Max int
BEGIN TRAN
SET @Max = (SELECT MAX(CaseNumber) FROM MyTable WITH (TABLOCK) 
            WHERE Location = @Location) + 1

INSERT INTO MyTable
@Location, @Max

COMMIT TRAN
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文