PostgreSQL 增量变量

PostgreSQL Increment varchar

有没有一种方法可以增加在 PostgreSQL 中声明为 varchar 的列。 如果我的值是 0001,0002,0003... 在我的专栏中如何继续添加 +1? 我尝试了 nextval 但它不起作用。

CREATE TABLE tab1 (
matri VARCHAR(10) NOT NULL,
role VARCHAR(4) NOT NULL,
libelle VARCHAR(40),
util VARCHAR(10),
) 

CREATE TABLE tab2 (
idemploye SERIAL,
nomred VARCHAR(10),
matri VARCHAR(10),
)

Insert into tab1 ("matri", "role", "libelle", "util")
select tab2.matri,tab1.role,'MANAGER',E'MANAGER' from tab1,tab2
where tab2.matri IN (Select matri from tab2); 

我希望我的第二列 "role" 随着每次插入而递增。

试试这个...

select CONVERT(varchar,substring('0001',1,2)) +
   RIGHT(REPLICATE('0',5) + convert(varchar,(CONVERT(int, substring('0001',3,5)) + 1)) ,5);

正如 a_horse_with_no_name 已经指出的那样,这里的理想情况是将其存储为 int 并显示格式,但我认为您的系统是有原因的,所以。

这样做的方法是,在插入语句的 select 子查询中:select 现有的最高值,转换为 int,递增,转换回 varchar,运行 到 lpad,然后以防万一还没有数据,与 '0001' 合并。

insert into tab1 ("matri", "role", "libelle", "util")
select
    tab2.matri,
    coalesce((select lpad((role::integer + 1)::varchar, 4, '0') from tab1 order by role desc limit 1), '0001'),
    'MANAGER',
    E'MANAGER'
from
    tab2
where
    tab2.matri IN (select matri from tab2);

另一种方法是创建一个触发器来为您执行此操作,因此您无需在插入 table:

的任何地方手动执行此操作
-- Create trigger function
create or replace function tg_fn_tab1_varchar_increment(
) returns trigger as $$
declare
    _r varchar;
begin
    select into _r
        role
    from
        tab1
    order by
        role desc
    limit 1;

    if _r is null then
        NEW.role := '0001';
        return NEW;
    end if;

    NEW.role := lpad((_r::integer + 1)::varchar, 4, '0');

    return NEW;
end;
$$ language plpgsql volatile;

-- Attach trigger
create trigger tg_tab1_varchar_increment before insert on tab1
    for each row execute procedure tg_fn_tab1_varchar_increment();

虽然更好的解决方案是使用整数列并在显示时添加填充,但这是可行的:

CREATE SEQUENCE role_seq;
CREATE TABLE roles (role varchar(4) NOT NULL DEFAULT lpad(nextval('role_seq')::varchar, 4, '0'));
INSERT INTO roles VALUES (DEFAULT), (DEFAULT);
SELECT * FROM roles;
--  role
-- ------
--  0001
--  0002

请注意,如果您删除行或插入事务回滚,您将在数字中出现间隙。