#!/bin/bash set -e echo "== Fixing sequences across all databases ==" for db in $(psql -Atqc "SELECT datname FROM pg_database WHERE datallowconn AND datname NOT IN ('template1','postgres')"); do echo "---- DB: $db ----" # Generate fix statements SQL=$(psql -d "$db" -Atqc " SELECT 'SELECT setval(' || quote_literal(pg_get_serial_sequence(quote_ident(n.nspname)||'.'||quote_ident(c.relname), a.attname)) || ', COALESCE(MAX(' || quote_ident(a.attname) || '), 0) + 1, false) FROM ' || quote_ident(n.nspname)||'.'||quote_ident(c.relname) || ';' FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace JOIN pg_attribute a ON a.attrelid = c.oid WHERE c.relkind = 'r' AND a.attnum > 0 AND NOT a.attisdropped AND pg_get_serial_sequence(quote_ident(n.nspname)||'.'||quote_ident(c.relname), a.attname) IS NOT NULL; ") if [ -z "$SQL" ]; then echo "No sequences found in $db" continue fi echo "Fixing sequences in $db..." # Execute generated statements echo "$SQL" | psql -d "$db" done echo "== Done fixing sequences =="