3

T_FATHER私は 2 つのテーブルを持っています。それらを と と呼びましょうT_CHILD。各父親は次のように複数の子を持つことができます。

T_FATHER
--------------------------
ID - BIGINT, from Generator

T_CHILD
-------------------------------
ID - BIGINT, from Generator
FATHER_ID - BIGINT, Foreign Key

ここで、テーブルにカウンターを追加しT_CHILDます。これは、1 から始まり、新しい子供ごとに 1 を追加しますが、グローバルではなく、父親ごとに、次のようになります。

ID | FATHER_ID | COUNTER |
--------------------------
1  | 1          | 1      |
--------------------------
2  | 1          | 2      |
--------------------------
3  | 2          | 1      |
--------------------------

私の最初の考えは、指定された父親に存在する子供の数をカウントし、カウンターに1を追加するbefore-insert-triggerを作成することでした。これは、同じカウンターで終了する 2 つの挿入が同時に行われない限り、正常に機能するはずです。これが実際には起こらない可能性は高いですが、後悔するよりは救ってください。

発電機を使用できるかどうかはわかりませんが、父親ごとに発電機が必要になるため、そうは思いません。

私の現在のアプローチは、前述のトリガーを使用し、FATHER_ID+COUNTERに一意のインデックスを追加して、同時挿入の 1 つだけが通過するようにすることです。クライアント側で例外を処理する必要があります (そして、失敗した挿入を再試行します)。

これを Firebird で直接処理するより良い方法はありますか?

PS: 2 つのテーブルのいずれも削除されないため、これは問題ではありません。

4

3 に答える 3

0

挿入中に、そのフィールド内で直接「Select...count + 1」を実行する必要があります。

しかし、そもそもそのフィールドを追加することをおそらく再考するでしょう。必要なときに簡単に推測できる冗長な情報のように感じます。 (たとえば、DENSE_RANK http://www.firebirdfaq.org/faq343/を使用して)

于 2016-12-21T07:41:27.300 に答える