【问题标题】:Fabricate entities with multiple IDENTITY PKs?制造具有多个 IDENTITY PK 的实体?
【发布时间】:2010-12-14 13:40:46
【问题描述】:

披露:我自己是“天然钥匙”的拥护者,反对 IDENTITY PK 方法。但我对生活方式的选择确实有一种“活着就让活着”的方法,所以请不要在这里争论宗教:)

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

  1. 插入表格。
  2. 使用 scope_identity 获取 自动生成的 ID。
  3. 使用自动生成的 ID 插入 到相关表中。

实际上,有一个辅助存储过程来创建实体并返回 ID。但是,我有几个问题:

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

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

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

【问题讨论】:

    标签: sql primary-key entity identity-column


    【解决方案1】:

    您指的是 MS SQL Server 吗?

    很遗憾,默认情况下 IDENTITY 列不允许显式插入。在其他 DBMS 中,自动递增不会阻止您将显式值插入该列,这将使提前选择键变得容易。不幸的是,在 SQL Server 上,您需要担心SET IDENTITY_INSERT 带来的不便。

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

    在我看来,为此使用 sproc 有点过头了,因为它通常就像选择 SCOPE_IDENTITY() 一样简单。通常,您可以通过编写每个插入来避免显式选择,这样它就可以直接使用最后一个插入的 SCOPE_IDENTITY()。

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

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

    【讨论】:

    • 感谢您的回复。是的,SQL 服务器。我不能使用 SCOPE_IDENTITY() 因为我想一次构建插入(比如说 100 行)而不是一个。所以 select-max then insert 可以工作,但如何找出为我的 100 条记录创建的值而不是其他人的?
    • 100 行并不多,您可以轻松地让脚本逐一循环,而且仍然不会花费很多时间。或者,select-max 以获取第一个空闲行并在随后的连续块中插入具有标识值的行:尽管在这种情况下您将不得不在第一个表中使用 IDENTITY_INSERT 一次性插入 100 行,然后使用 IDENTITY_INSERT 在下一个文本中插入 100 个对应的行,因为它一次只能在一个表上设置。
    猜你喜欢
    • 2013-09-07
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多