【问题标题】:How to insert an n:m-relationship with technical primary keys generated by a sequence?如何使用序列生成的技术主键插入 n:m 关系?
【发布时间】:2011-02-15 19:47:11
【问题描述】:

假设我有两个包含多个字段的表,每个表中都有一个主键,它是由数据库序列生成的技术 ID:

table1             table2
-------------      -------------
field11  <pk>      field21  <pk>
field12            field22

field11field21 由序列生成。

table1table2 之间也存在 n:m 关系,设计于 table3

table3
-------------
field11  <fk>
field21  <fk>

table1table2 中的 id 是在插入语句期间生成的:

INSERT INTO table1 VALUES (table1_seq1.NEXTVAL, ...
INSERT INTO table2 VALUES (table2_seq1.NEXTVAL, ...

因此我不知道我的程序的数据访问层中添加行的主键,因为pk的生成完全发生在数据库中。

现在更新table3 的最佳做法是什么?如何访问我刚刚插入的行的主键?

【问题讨论】:

  • 虽然我解决了我的问题,但我将这个问题留待讨论,因为我认为这可能是一个普遍的问题。我有一些与我没有明确提及的问题相关的细节,因为我想笼统地讨论这个话题。我使用 Ibator Ibatis 作为 DAO 框架,这可以通过在 ibator.config-file 中的 &lt;table-name&gt;-tag 中使用 &lt;generated-key&gt;-tag 来处理这种情况。有关此特定案例的更多信息,请查看 Ibatis manual

标签: database sequences data-access


【解决方案1】:

您没有这些表的另一个(非代理)候选键吗?一般来说,将代理键作为任何表的 only 键并不是很有用。假设您确实有其他键,那么您可以使用它来检索您插入的行。

【讨论】:

    【解决方案2】:

    如果您遇到这个问题并且您使用 Ibator Ibatis 框架作为 DAO 层(就像我们一样),您可以通过在 ibator.config 中使用 &lt;generated-key&gt;-tag 来处理这种情况。

    一般来说,你通过做一个来解决这个问题

    SELECT sequencename.nextval FROM tablename
    

    在名为tablename 的表上使用序列sequencename 获取要插入的值的下一个键。

    PS:这里不需要关注transactionhandling,因为下次调用nextval-function会返回下一个sequencevalue。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2011-09-15
      相关资源
      最近更新 更多