ホームページ >データベース >mysql チュートリアル >トリガーを使用して別の列に依存する PostgreSQL シーケンスを作成する方法

トリガーを使用して別の列に依存する PostgreSQL シーケンスを作成する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-24 06:10:11934ブラウズ

How to Create PostgreSQL Sequences Dependent on Another Column Using Triggers?

別の列に基づく PostgreSQL シーケンス

PostgreSQL では、トリガーを通じて別の列に依存するシーケンスを作成できます。次のテーブル構造を考えてみましょう:

列名 数据类型 说明
id integer 主键,外键关联其他表
seq integer 每个ID都有其自身的seq编号
data text 一些文本数据,与序列无关

ID シーケンスは、結合された一意のキーを構成します。

期待される結果を達成するには、thing と thing という 2 つのテーブルを作成する必要があります。

テーブルの作成:

<code class="language-sql">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)
);</code>

シーケンストリガーの作成:

Things テーブルにトリガーを設定して、挿入されたデータの各行に新しいシーケンスを作成します:

<code class="language-sql">CREATE FUNCTION make_thing_seq() RETURNS trigger
LANGUAGE plpgsql
AS $$
begin
  execute format('create sequence thing_seq_%s', NEW.id);
  return NEW;
end
$$;

CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE make_thing_seq();</code>

フィルシーケンストリガー:

最後に、スタッフ テーブルにトリガーを作成し、挿入ごとに正しいシーケンスを使用するようにします。

<code class="language-sql">CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger
LANGUAGE plpgsql
AS $$
begin
  NEW.seq := nextval('thing_seq_' || 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 テーブルに挿入されたデータは、対応するシーケンスを作成して使用します。例:

<code class="language-sql">insert into things (name) values ('Joe');
insert into things (name) values ('Bob');

insert into stuff (id, notes) values (1, 'Keychain');
insert into stuff (id, notes) values (1, 'Pet goat');
insert into stuff (id, notes) values (2, 'Family photo');
insert into stuff (id, notes) values (1, 'Redundant lawnmower');</code>

結果は次のようになります:

<code>| id | seq | notes |
|---|---|---|
| 1 | 1 | Keychain |
| 1 | 2 | Pet goat |
| 2 | 1 | Family photo |
| 1 | 3 | Redundant lawnmower |</code>

このアプローチでは、Things テーブルの ID 列に基づいてシーケンスを効果的に作成し、ID ごとに一意のシーケンスが生成されるようにします。

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

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