首頁 >資料庫 >mysql教程 >如何使用觸發器建立依賴另一列的 PostgreSQL 序列?

如何使用觸發器建立依賴另一列的 PostgreSQL 序列?

Patricia Arquette
Patricia Arquette原創
2025-01-24 06:10:11889瀏覽

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

基於另一列的PostgreSQL序列

在PostgreSQL中,可以透過觸發器建立依賴另一列的序列。考慮以下表格結構:

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

其中id seq構成一個組合唯一鍵。

為了實現預期結果,需要建立兩個表:things和stuff。

建立表格:

<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>

填充序列觸發器:

最後,在stuff表上建立一個觸發器,確保為每次插入使用正確的序列:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn