ホームページ >データベース >mysql チュートリアル >シーケンスとトリガーを使用して PostgreSQL でサブシーケンスを生成する方法
この記事では、シーケンスとトリガーを使用して PostgreSQL でサブシーケンスを生成する方法について詳しく説明します。 このシナリオには複合主キー (id、seq) を持つテーブルが含まれており、各 id
.
この解決策には、2 つのテーブルを作成し、トリガーを実装することが含まれます。
テーブル構造:
id
を主キーとして、主要なエンティティが格納されます。id
(things
を参照する外部キー)、seq
(サブシーケンス番号)、および notes
を含むサブシーケンスが格納されます。主キーは、id
と seq
の組み合わせです。トリガーと関数:
things
テーブル トリガー (make_thing_seq
): このトリガーは、 テーブルへの各挿入の 後things
に実行されます。 新しい thing_seq_{id}
ごとに id
という名前の新しいシーケンスを作成します。
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 サイトの他の関連記事を参照してください。