PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como atualizar em massa o ID de sequência postgreSQL para todas as tabelas


Assumindo que todas as sequências usadas são de propriedade das respectivas colunas, e. através de um serial ou identity atributo, você pode usar isso para redefinir todas as sequências (de propriedade) no banco de dados atual.
with sequences as (
  select *
  from (
    select table_schema,
           table_name,
           column_name,
           pg_get_serial_sequence(format('%I.%I', table_schema, table_name), column_name) as col_sequence
    from information_schema.columns
    where table_schema not in ('pg_catalog', 'information_schema')
  ) t
  where col_sequence is not null
), maxvals as (
  select table_schema, table_name, column_name, col_sequence,
          (xpath('/row/max/text()',
             query_to_xml(format('select max(%I) from %I.%I', column_name, table_schema, table_name), true, true, ''))
          )[1]::text::bigint as max_val
  from sequences
) 
select table_schema, 
       table_name, 
       column_name, 
       col_sequence,
       coalesce(max_val, 0) as max_val,
       setval(col_sequence, coalesce(max_val, 1)) --<< this will change the sequence
from maxvals;

A primeira parte seleciona todas as sequências pertencentes a uma coluna. A segunda parte usa query_to_xml() para obter o valor máximo da coluna associada a essa sequência. E o SELECT final aplica esse valor máximo a cada sequência usando setval() .

Você pode querer executar isso sem o setval() ligue primeiro para ver se está tudo como você precisa.