使用多个IDENTITY PK构建实体?

时间:2009-11-09 09:20:16

标签: sql primary-key entity identity-column

披露:我自己是'天生的关键'倡导者,并且反对IDENTITY PK方法。但我确实有一种“生活和让生活”的方式来选择生活方式,所以请不要在这里提出任何宗教观点:)

我继承了一个表,唯一的键是IDENTITY PK列;我们称之为ID。有许多表引用ID。创建新实体的预期过程似乎是:

  1. 插入表格。
  2. 使用scope_identity来抓取 自动生成的ID。
  3. 使用自动生成的ID进行INSERT 进入相关表格。
  4. 实际上,有一个帮助器存储过程来创建一个实体并返回该ID。但是,我有几个问题:

    我需要比助手存储过程更进一步,并在相关表中创建行,这些行本身具有IDENTITY PK,因此对于每个实体,我需要在此过程中获取几个自动生成的值。 我需要编写几百个实体,并且帮助程序proc被编码为一次处理一个实体。

    使用“IDENTITY PK”设计批量制作实体的最佳方法是什么?

    当使用我自己的“自然键”设计时,我可以提前生成键值,因此它只是加载一些临时表并按外键所需的顺序插入表中的情况。因此,我很想找到一系列高值INTEGER值(以匹配IDENTIY列的类型),我知道它现在没有被使用,并希望它们不会被用到时间INSERT。这是个好主意吗?

1 个答案:

答案 0 :(得分:0)

您是否专门讨论MS SQL Server?

遗憾的是,IDENTITY列默认情况下禁止显式插入。在其他DBMS中,自动增量不会阻止您在该列中插入显式值,这样可以提前轻松选择键。不幸的是,在SQL Server上,SET IDENTITY_INSERT会给您带来不便。

  

有一个帮助器存储过程来创建实体并返回ID。

对我来说,使用sproc似乎有点过分,因为它通常与选择SCOPE_IDENTITY()一样简单。通常,您可以通过编写每个插入来避免显式选择,以便它可以直接使用最后一个插入的SCOPE_IDENTITY()。

  

找到一系列高值的INTEGER值,我知道这些值现在没有被使用,并希望它们不会被使用[...]这是一个好主意吗?

它们不一定非常高;事实上,如果你经常这样做,你会在IDENTITY值上留下许多巨大的空白,这通常可以更好地避免。您甚至可以使用MAX(column)+1值,只要您捕获了其他人在两次之间使用这些值的错误,或者更好的是,执行select-max然后在事务中插入。