批量更新postgresql序列

时间:2018-12-16 18:50:47

标签: database postgresql sequence plpgsql

我有要导入到新系统中的现有数据。 我想根据现有表的长度设置序列。我尝试了这个,但得到了number == 1

DO
$do$
   DECLARE
   _tbl text;
   number int;
    BEGIN
        FOR _tbl  IN
           SELECT c.relname FROM pg_class c WHERE c.relkind = 'S' and c.relname ilike '%y_id_seq'
        LOOP
        -- EXECUTE
           SELECT count(*) FROM regexp_replace(_tbl, '(\w)y_.*', '\1ies')  INTO number;
           RAISE NOTICE '%', number;
           EXECUTE format('SELECT setval(''"%s"'', ''%s'' )', _tbl, number);
        END LOOP;
    END
$do$;

我应该怎么做才能获得正确的计数?

1 个答案:

答案 0 :(得分:1)

COUNT(*)不是新序列值的最佳选择。试想一下,您的编号存在漏洞,例如1, 2, 15Count3,但下一个值应为16,以免将来重复。

假设您对id列使用序列,我建议:

SELECT max(id) FROM _table_name_ INTO number;

或更简单:

SELECT setval(_sequence_name_, max(id)) FROM _table_name_;