0

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

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

field11并由field21序列生成。

table1und之间还有一个:m 关系table2,设计于table3

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

table1und中的 idtable2是在 insert 语句期间生成的:

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

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

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

4

2 回答 2

1

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

于 2010-05-05T08:30:35.493 回答
0

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

通常,您通过执行以下操作来解决此问题

SELECT sequencename.nextval FROM tablename

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

PS:这里不需要注意事务处理,因为nextval-function的下一次调用会返回下一个sequencevalue。

于 2010-05-10T12:58:25.793 回答