基于另一列的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中文网其他相关文章!