问题描述
我在下面的数据表中,我想为data_id创建一个唯一的id,该id将对每个group_id唯一(group_id和data_id应该是唯一的),并且对于每个组,data_id应该从1开始。如何创建数据库序列以实现这个 ?或任何其他更好的方法来实现这一目标?
group_id data_id
UUID-1 1
UUID-1 2
UUID-1 3
UUID-1 4
UUID-2 1
UUID-2 2
解决方法
DB序列在这种情况下将无济于事。您可以在某些警告中使用触发器:
尝试一下:
创建如下触发函数:
create or replace function trig_fun()
returns trigger AS
$$
begin
select coalesce(max(data_id),0)+1 into new.data_id from my_table where group_id=new.group_id;
return new;
end;
$$
language plpgsql
并在before insert
事件上附加上述功能
create trigger trig_on_insert
before insert on
my_table
for each row
execute procedure trig_fun()
限制:
- 如果删除该组中具有最大值的任何组的行,它将在下一次插入同一组时重新分配相同的编号。
- 如果您更新的ID大于该组中的其他ID,则下一个值将从该ID递增。
create function tgf_mytable_bi()
returns trigger
language plpgsql
as $f$
declare
seq_name text;
begin
seq_name := 'seq_'||new.group_id;
-- Check is sequence already exists
if (select count(*) = 0 from pg_class where relkind = 'S' and relname = seq_name) then
-- New group detected
-- Create new sequence for it
execute format('create sequence %I',seq_name);
-- Sequence exists,get next value from it
end if;
-- Generate next value for group
new.data_id := nextval(seq_name);
end $f$;
create trigger trg_mytable_bi
before insert on mytable
for each row
execute procedure tgf_mytable_bi();