假设我有两个包含多个字段的表,每个表中都有一个主键,它是由数据库序列生成的技术ID:
table1 table2
------------- -------------
field11 <pk> field21 <pk>
field12 field22
field11
和field21
由序列生成。
table1
和table2
之间存在n:m关系,设计在table3
中:
table3
-------------
field11 <fk>
field21 <fk>
table1
和table2
中的ID是在插入语句中生成的:
INSERT INTO table1 VALUES (table1_seq1.NEXTVAL, ...
INSERT INTO table2 VALUES (table2_seq1.NEXTVAL, ...
因此,我不知道程序的数据访问层中添加的行的主键,因为pk
的生成完全发生在数据库中。
现在更新table3
的最佳做法是什么?如何访问刚刚插入的行的主键?
答案 0 :(得分:0)
您是否拥有这些表的另一个(非代理)候选键?通常,将代理键设置为任何表的 only 键并不是非常有用。假设您确实有其他密钥,那么您可以使用它来检索您插入的行。
答案 1 :(得分:0)
如果您遇到此问题并且使用Ibator Ibatis框架作为DAO层(就像我们一样),您可以使用ibator.config中的<generated-key>
- 标记处理此案例。
一般来说,你可以通过
来解决这个问题SELECT sequencename.nextval FROM tablename
在名为tablename
的表上使用序列sequencename
获取要插入的值的下一个键。
PS:这里没有必要注意事务处理,因为nextval
- 函数的下一次调用将返回下一个序列值。