массовое обновление последовательностей postgresql - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть данные, которые я хочу импортировать в новую систему.Я хочу установить последовательности в соответствии с длиной существующих таблиц.Я пытаюсь это сделать, но получаю 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 голосов
/ 16 декабря 2018

COUNT(*) - не лучший выбор для нового значения последовательности.Просто представьте, что у вас есть дыры в вашей нумерации, например 1, 2, 15.Count равно 3, но следующее значение должно быть 16, чтобы избежать дублирования в будущем.

Если вы используете последовательность для столбца id, я бы предложил:

SELECT max(id) FROM _table_name_ INTO number;

Или еще проще:

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