0

いくつかのフィールドを持つ 2 つのテーブルがあり、すべてのテーブルに、データベース シーケンスによって生成された技術 ID である主キーがあるとします。

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

field11シーケンスによってfield21生成されます。

で設計されたtable1und間に an : m-relationship もあります。table2table3

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

table1undの ID はtable2、挿入ステートメント中に生成されます。

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次のシーケンス値が返されるためです。

于 2010-05-10T12:58:25.793 に答える