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中文网其他相关文章!