Postgresql中当我们创建Sequence序列的时候,往往初始值是1并以此开始做递增作为相应的数据表列中插入的默认值,当相应表的初始数据来源于外部(比如原来项目采用的是MSSQL时)迁移而来的数据时,这时序列的当前值与数据中的相应列的最大值并不同步,这时需要重新设置数库表中各个表的序列的当前值,以便下次插入数据时不会插入重复的序列值。
以下脚本可以自动同步DB中所有Serial类型产生的序列的当前值为相应表的最大ID值,并让下次插入时得到递增的值:
--初始化所有序列的当前值:
do $body$
declare
seq_name text;
table_and_id_string text;
table_name text;
id_name text;
sqltext text:='';
delimiter_reverse_pos integer;
begin
for seq_name in select relname from pg_class where relkind='S' order by relname loop
if seq_name like '%_seq' then
table_and_id_string:=substr(seq_name,1,length(seq_name)-4);
delimiter_reverse_pos:=strpos(reverse(table_and_id_string),'_');
table_name:=left(table_and_id_string,length(table_and_id_string)-delimiter_reverse_pos);
id_name:=right(table_and_id_string,delimiter_reverse_pos-1);
sqltext:=sqltext||'select setval(''"'||seq_name|| '"'',(select max("'||id_name||'") from "'||table_name||'"));'||chr(10);
end if;
end loop;
--raise notice '%',sqltext;
execute sqltext;
EXCEPTION
WHEN others THEN
RAISE NOTICE '%', '执行出错,请检查是否从序列名中匹配的对象不存在!';
RAISE EXCEPTION '(%)', SQLERRM;
end
$body$;