我们有一些代码需要在 SQL 中维护我们自己的标识 (PK) 列。我们有一个表,我们在其中批量插入数据,但是我们在批量插入完成之前将数据添加到相关表中,因此我们无法使用 IDENTITY 列并预先找出值。
当前代码正在选择字段的 MAX 值并将其递增 1。虽然我们的应用程序的两个实例同时运行的可能性很小,但它仍然不是线程安全的(不是提到它每次都会进入数据库)。
我正在使用 ADO.net 实体模型。我将如何“保留”要使用的 id 范围,当该范围用完时,抓取一个新 block 来使用,并保证不会使用相同的范围。
最佳答案
- 使用更通用的唯一标识符数据类型,如
UNIQUEIDENTIFIER
(UUID
) 而不是INTEGER
。在这种情况下,您基本上可以在客户端创建它,将它传递给SQL
而不必担心。当然,缺点是该字段的大小。 - 在数据库中创建一个简单的表
CREATE TABLE ID_GEN (ID INTEGER IDENTITY)
,并将其用作工厂
来为您提供标识符。理想情况下,您将创建一个存储过程(或函数),您将向其传递所需数量的标识符。然后,存储过程会将此行数(空)插入到此ID_GEN
表中,并将返回所有新的ID
,您可以在代码中使用这些行。显然,您的原始表将不再具有IDENTITY
。 - 创建您自己的上述
ID_Factory
变体。
如果您没有其他限制,我会选择简单性 (UUID
)。
关于c# - 如何正确保留标识值以供在数据库中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3056646/