Обновление счётчика 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;
Опубликовано
02.06.2021