ホームページ >データベース >mysql チュートリアル >シーケンスとトリガーを使用して PostgreSQL でサブシーケンスを生成する方法

シーケンスとトリガーを使用して PostgreSQL でサブシーケンスを生成する方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-24 05:51:38965ブラウズ

How to Generate Subsequences in PostgreSQL Using Sequences and Triggers?

この記事では、シーケンスとトリガーを使用して PostgreSQL でサブシーケンスを生成する方法について詳しく説明します。 このシナリオには複合主キー (id、seq) を持つテーブルが含まれており、各 id.

に一意のシーケンスを作成するカスタム ソリューションが必要です。

この解決策には、2 つのテーブルを作成し、トリガーを実装することが含まれます。

テーブル構造:

  • thing: このテーブルには、id を主キーとして、主要なエンティティが格納されます。
  • stuff: このテーブルには、id (things を参照する外部キー)、seq (サブシーケンス番号)、および notes を含むサブシーケンスが格納されます。主キーは、idseq の組み合わせです。

トリガーと関数:

  1. things テーブル トリガー (make_thing_seq): このトリガーは、 テーブルへの各挿入の things に実行されます。 新しい thing_seq_{id} ごとに id という名前の新しいシーケンスを作成します。

  2. stuff テーブル トリガー (fill_in_stuff_seq): このトリガーは、 テーブルへの各挿入のstuffに実行されます。挿入された thing_seq_{id} に基づいて、適切なシーケンス (id) から次の値を取得し、それを seq 列に割り当てます。

実装例:

次のコードは、テーブルの作成とトリガーの実装を示しています。

<code class="language-sql">-- Create the tables
CREATE TABLE things (
    id serial primary key,
    name text
);

CREATE TABLE stuff (
    id integer references things,
    seq integer NOT NULL,
    notes text,
    primary key (id, seq)
);

-- Trigger in things table to create new sequences
CREATE OR REPLACE FUNCTION make_thing_seq() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
begin
  EXECUTE format('CREATE SEQUENCE IF NOT EXISTS thing_seq_%s', NEW.id); -- Added IF NOT EXISTS
  RETURN NEW;
end;
$$;

CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE make_thing_seq();

-- Trigger in stuff table to use correct sequence
CREATE OR REPLACE FUNCTION fill_in_stuff_seq() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
begin
  NEW.seq := nextval(format('thing_seq_%s', NEW.id));
  RETURN NEW;
end;
$$;

CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();</code>
この設定により、

things にデータを挿入すると、各 stuff に一意のサブシーケンスが自動的に生成され、複合主キーの整合性が維持されます。 指定された ID のシーケンスがすでに存在する場合のエラーを防ぐために、id 句が IF NOT EXISTS 関数に追加されました。make_thing_seq

以上がシーケンスとトリガーを使用して PostgreSQL でサブシーケンスを生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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