PostgreSQL增量varchar

时间:2018-07-19 14:02:55

标签: postgresql increment

有没有一种方法可以增加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); 

我希望我的第二列“角色”随每次插入而增加。

3 个答案:

答案 0 :(得分:1)

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

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

请注意,如果删除行或插入事务回滚,则数字之间会出现空白。

答案 1 :(得分:0)

如a_horse_with_no_name所述,理想的做法是将其存储为int格式并在显示时使用,但我认为您的系统是有原因的。

执行此操作的方法是,在插入语句的select子查询中:选择现有的最高值,转换为int,递增,转换回varchar,运行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); ,然后以防万一还没有数据,将其与'0001'合并。

-- 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();

另一种方法是创建一个触发器来为您执行此操作,因此您无需在插入表的任何地方手动进行此操作:

$('#demo').on('slide.bs.carousel', function (e) {
  if(!e.to){
    //set body bgcolor
  }else{
    //remove body bgcolor
  }
});

答案 2 :(得分:-1)

尝试一下...

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