Lab / PostgreSQL

PostgreSQL: Исправление ошибки duplicate key value violates unique constraint "pages_pkey" дублирования ключей в PostgreSQL после восстановления из резервной копии

Наверняка вы тоже сталкивались с ситуацией когда после восстанавления базы данных PostgreSQL из резервной копии, натыкались на ошибку "duplicate key value violates unique constraint", когда пытаетесь вставить новые записи?

Проблема обычно заключается в том, что автоинкрементные последовательности не обновляются правильно во время восстановления.

Делюсь классным скриптом, который проверит каждую таблицу и установит правильные значения автоинкремента.

Просто выполните этот запрос:

DO $$ 
DECLARE
    rec RECORD;
    seq_name TEXT;
    max_id BIGINT;
BEGIN
    FOR rec IN 
        SELECT 
            table_name, 
            column_name, 
            column_default 
        FROM 
            information_schema.columns 
        WHERE 
            column_default LIKE 'nextval%'
    LOOP
        seq_name := regexp_replace(rec.column_default, 'nextval\(''(.*)''::regclass\)', '\1');
        EXECUTE format('SELECT COALESCE(MAX(%I), 0) + 1 FROM %I', rec.column_name, rec.table_name) INTO max_id;
        EXECUTE format('SELECT setval(''%s'', %s, false)', seq_name, max_id);
    END LOOP;
END $$;

Вот и всё, надеюсь раз вы здесь, что это не произошло с вашей продакшен базой =)