Обновление счётчика Postgres

После импорта данных порой возникает трабл с инсертами, когда Postgres жалуется на дублирующиеся значения Primary Key.

Обычно это связано с тем, что при заливке данных не была обновлена последовательность, из которой берутся значения для следующего PK.

Обновить значение последовательности можно так:

SELECT setval('your_sequence_name', (SELECT max(id) FROM your_table));

Установить следующее значение для последовательности ID можно так:

select setval(
  PG_GET_SERIAL_SEQUENCE('<TABLE_NAME>', '<AUTOINC_FIELD_NAME>'), 
  (select (MAX("<AUTOINC_FIELD_NAME>") + 1) FROM "<TABLE_NAME>"), 
false)

А этот запрос позволяет обновить вообще все счётчики (ист. https://wiki.postgresql.org/wiki/Fixing_Sequences):

SELECT 'SELECT SETVAL(' ||
       quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
       ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
       quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
FROM pg_class AS S,
     pg_depend AS D,
     pg_class AS T,
     pg_attribute AS C,
     pg_tables AS PGT
WHERE S.relkind = 'S'
    AND S.oid = D.objid
    AND D.refobjid = T.oid
    AND D.refobjid = C.attrelid
    AND D.refobjsubid = C.attnum
    AND T.relname = PGT.tablename
ORDER BY S.relname;

Комментарии

comments powered by Disqus
Яндекс.Метрика