有没有一种方法可以增加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);
我希望我的第二列“角色”随每次插入而增加。
答案 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);