PostgreSQL:基於另一列建立輔助序列
在PostgreSQL中,您可以建立一個依賴另一列的序列,讓您在表格的子群組內產生順序號碼。
考慮以下表格:
<code class="language-sql">CREATE TABLE stuff ( id integer PRIMARY KEY, seq integer NOT NULL, data text );</code>
您希望id和seq的每種組合都是唯一的,類似於以下範例:
<code>ID | SEQ | DATA ----+------ +------------------- 1 | 1 | Quick brown fox... 1 | 2 | Quick brown fox... 1 | 3 | Quick brown fox... 2 | 1 | Quick brown fox... 3 | 1 | Quick brown fox...</code>
建立輔助表和觸發器
為此,您需要建立兩個表和一個觸發器:
<code class="language-sql">CREATE TABLE things ( id SERIAL PRIMARY KEY, name text ); CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE nextval('things_id_seq'); CREATE SEQUENCE things_id_seq;</code>
things
表格是包含id
列的父表。 make_thing_seq
觸發器會為插入到things
表中的每一行自動建立一個新的序列,命名為thing_seq_<thing_id>
。
填充Stuff序列
現在,您需要建立第二個觸發器來填入stuff
表中的seq
列:
<code class="language-sql">CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger AS $$ BEGIN NEW.seq := nextval('thing_seq_' || NEW.id); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();</code>
此觸發器確保當向stuff
表插入新行時,它會檢索相應的序列(基於id
列)並將它的下一個值分配給seq
列。 注意,這裡加入了LANGUAGE plpgsql
聲明,明確指定函數的語言為PL/pgSQL。
示範
插入一些資料並驗證序列產生:
<code class="language-sql">INSERT INTO things (name) VALUES ('Joe'); INSERT INTO things (name) VALUES ('Bob'); SELECT * FROM things; -- 检查序列表 \d+ things_id_seq INSERT INTO stuff (id, data) VALUES (1, 'Keychain'); INSERT INTO stuff (id, data) VALUES (1, 'Pet goat'); INSERT INTO stuff (id, data) VALUES (2, 'Family photo'); INSERT INTO stuff (id, data) VALUES (1, 'Redundant lawnmower'); SELECT * FROM stuff;</code>
結果將示範基於id
列的序列的自動分配。 d things_id_seq
命令用於顯示序列的詳細資訊。
以上是如何建立依賴另一列的 PostgreSQL 序列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!