ホームページ >データベース >mysql チュートリアル >トリガーを使用して別の列に依存する PostgreSQL シーケンスを作成する方法
別の列に基づく 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 サイトの他の関連記事を参照してください。