基於另一列的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中文網其他相關文章!