ホームページ >データベース >mysql チュートリアル >別の列に依存する PostgreSQL シーケンスを作成するには?

別の列に依存する PostgreSQL シーケンスを作成するには?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-24 05:58:13511ブラウズ

How to Create a PostgreSQL Sequence Dependent on Another Column?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。