PostgreSQL: 別の列に基づいて補助シーケンスを作成します
PostgreSQL では、別の列に依存するシーケンスを作成して、テーブルのサブグループ内にシーケンス番号を生成できます。
次の形式を考えてみましょう:
<code class="language-sql">CREATE TABLE stuff ( id integer PRIMARY KEY, seq integer NOT NULL, data text );</code>
次の例のように、id と seq の各組み合わせを一意にする必要があります。
<code>ID | SEQ | DATA ----+------ +------------------- 1 | 1 | Quick brown fox... 1 | 2 | Quick brown fox... 1 | 3 | Quick brown fox... 2 | 1 | Quick brown fox... 3 | 1 | Quick brown fox...</code>
補助テーブルとトリガーを作成する
これを行うには、2 つのテーブルとトリガーを作成する必要があります:
<code class="language-sql">CREATE TABLE things ( id SERIAL PRIMARY KEY, name text ); CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE nextval('things_id_seq'); CREATE SEQUENCE things_id_seq;</code>
things
テーブルは、id
列を含む親テーブルです。 make_thing_seq
トリガーは、things
テーブルに挿入された行ごとに thing_seq_<thing_id>
という名前の新しいシーケンスを自動的に作成します。
スタッフシーケンスを埋める
次に、stuff
テーブルの seq
列に値を設定する 2 番目のトリガーを作成する必要があります:
<code class="language-sql">CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger AS $$ BEGIN NEW.seq := nextval('thing_seq_' || NEW.id); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();</code>
このトリガーは、新しい行が stuff
テーブルに挿入されるときに、対応するシーケンス (id
列に基づいて) を取得し、その次の値を seq
列に割り当てます。 LANGUAGE plpgsql
ステートメントは、関数の言語が PL/pgSQL であることを明確に指定するためにここに追加されていることに注意してください。
デモ
データを挿入し、シーケンスの生成を確認します:
<code class="language-sql">INSERT INTO things (name) VALUES ('Joe'); INSERT INTO things (name) VALUES ('Bob'); SELECT * FROM things; -- 检查序列表 \d+ things_id_seq INSERT INTO stuff (id, data) VALUES (1, 'Keychain'); INSERT INTO stuff (id, data) VALUES (1, 'Pet goat'); INSERT INTO stuff (id, data) VALUES (2, 'Family photo'); INSERT INTO stuff (id, data) VALUES (1, 'Redundant lawnmower'); SELECT * FROM stuff;</code>
結果は、id
列に基づいたシーケンスの自動割り当てを示します。 d things_id_seq
コマンドはシーケンスの詳細を表示するために使用されます。
以上が別の列に依存する PostgreSQL シーケンスを作成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。