如何使用序列生成的技术主键插入n:m关系?

时间:2010-05-05 08:18:21

标签: database sequences data-access

假设我有两个包含多个字段的表,每个表中都有一个主键,它是由数据库序列生成的技术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的最佳做法是什么?如何访问刚刚插入的行的主键?

2 个答案:

答案 0 :(得分:0)

您是否拥有这些表的另一个(非代理)候选键?通常,将代理键设置为任何表的 only 键并不是非常有用。假设您确实有其他密钥,那么您可以使用它来检索您插入的行。

答案 1 :(得分:0)

如果您遇到此问题并且使用Ibator Ibatis框架作为DAO层(就像我们一样),您可以使用ibator.config中的<generated-key> - 标记处理此案例。

一般来说,你可以通过

来解决这个问题
SELECT sequencename.nextval FROM tablename

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

PS:这里没有必要注意事务处理,因为nextval - 函数的下一次调用将返回下一个序列值。