次の理由から、通常のシーケンスほど簡単な簡単な方法があるとは思いません。
- シーケンスは1つの数値ストリーム(次の値など)のみを格納します。パーティションごとに1つ必要です。
- シーケンスには、現在のトランザクションをバイパスする特別な処理があります(競合状態を回避するため)。 dblinkのようなトリックを使用せずに、SQLまたはPL/pgSQLレベルでこれを複製することは困難です。
- DEFAULT列プロパティでは、単純な式または
nextval('myseq')
のような関数呼び出しを使用できます。;ただし、他の列を参照して、値の取得元のストリームを関数に通知することはできません。
うまくいくものを作ることはできますが、おそらくそれは単純だとは思わないでしょう。上記の問題に順番に対処します:
- テーブルを使用して、
multiseq (partition_id, next_val)
のようなスキーマを使用して、すべてのパーティションの次の値を格納します 。 -
multinextval(seq_table, partition_id)
を記述します 次のような機能を実行します:- 現在のトランザクションから独立した新しいトランザクションを作成します(これを行う1つの方法は、dblinkを使用することです。他のサーバー言語の方が、より簡単に作成できると思います)。
-
seq_table
に記載されているテーブルをロックします 。 - パーティションIDが
partition_id
である行を更新します 、増分値を使用します。 (または、既存の行がない場合は、値2の新しい行を挿入します。) - そのトランザクションをコミットし、以前に保存されたID(または1)を返します。
-
multinextval('projects_table', NEW.Project_ID)
の呼び出しを使用する挿入トリガーをプロジェクトテーブルに作成します 挿入用。
私はこの計画全体を自分で使用したことはありませんが、各ステップに似たものを個別に試しました。 multinextval
の例 これを試みたい場合は、関数とトリガーを提供できます...