如何基于其他列值创建序列

问题描述

我在下面的数据表中,我想为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()

限制:

  1. 如果删除该组中具有最大值的任何组的行,它将在下一次插入同一组时重新分配相同的编号。
  2. 如果您更新的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();

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...