1

Postgresで2つのシーケンスの同期を維持する方法はありますか?

私が持っている場合は:

table_A_id_seq = 1
table_B_id_seq = 1

実行するとSELECT nextval('table_A_id_seq'::regclass)

私はそれtable_B_id_seqが同じ値を取ることを望みますtable_A_id_seq

そして明らかにそれは反対側でも同じでなければなりません。

Djangoにあるいくつかの制約をハックする必要があるため(そしてそこで解決できないため)、2つの異なるシーケンスが必要です。

4

4 に答える 4

1

2 つのテーブルは何らかの形で関連付けられている必要がありますか? その関係をシーケンスを含むルックアップ テーブルにカプセル化し、処理する予定の 2 つのテーブルをルックアップ テーブルを使用するビューに置き換えます。

于 2010-05-20T09:49:04.137 に答える
0

これを見たときの私の最初の考えは、なぜあなたは本当にこれをしたいのですか?これは少し甘やかされたにおいがします。数日後に牛乳がするようなものです.

これら 2 つの seq が同じ値のままである必要があるシナリオは何ですか?

私が胃の中で感じている「これは少し奇妙に思える」という感情を無視して、これを試すことができます:

挿入時にこれを行うトリガーを table_a に配置します。-- b seq を a の値に設定します。

select setval('table_b_seq',currval('table_a_seq'));

このアプローチの問題は、table_a への挿入のみが table_a_seq 値を変更し、それ以外に table_a_seq をインクリメントしないと想定していることです。あなたがそれを受け入れることができるなら、これは本当にハックな方法で動作するかもしれません.

これが本当に必要な場合は、より堅牢にするために、関数などの table_a_seq をインクリメントする単一のインターフェイスを作成します。また、この関数を介した table_a_seq の操作のみを許可します。select setval('table_b_seq',currval('table_a_seq'));そうすれば、table_a_seq をインクリメントする 1 つのインターフェイスがあり、その関数にも入れる必要があり ます。そうすれば、table_b_seq は常に table_a_seq と等しくなるように設定されます。これは、ユーザーへの table_a_seq への許可をすべて削除し、新しい関数に対する実行許可のみをユーザーに許可することを意味します。

于 2010-03-25T21:19:06.440 に答える
0

両方のテーブルに 1 つのシーケンスを使用するだけです。常に何度も何度も同期しない限り、同期を保つことはできません。シーケンスはトランザクションセーフではありません。常にロールフォワードし、ロールバックすることはありません。

編集: 1 つのシーケンスも機能しません。両方のテーブルで同じ番号が得られません。サブクエリを使用して正しい番号を取得し、1 つのテーブルに対して 1 つのシーケンスのみを使用します。他のテーブルはサブクエリを使用する必要があります。

于 2010-03-25T21:22:59.993 に答える
0

のシーケンスを増加させるコードを実行するINSERTトリガーを配置できます。これで、新しい行を に挿入するたびに、そのトリガーが起動されます。Table_ATable_BTable_A

于 2010-03-25T17:12:05.857 に答える