PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So aktualisieren Sie die Sequenz-ID postgreSQL für alle Tabellen massenweise

Unter der Annahme, dass alle verwendeten Sequenzen den jeweiligen Spalten gehören, z. über eine serial oder identity Attribut können Sie dieses verwenden, um alle (eigenen) Sequenzen in der aktuellen Datenbank zurückzusetzen.

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;

Der erste Teil wählt alle Sequenzen aus, die einer Spalte gehören. Der zweite Teil verwendet dann query_to_xml() um den maximalen Wert für die Spalte zu erhalten, die dieser Sequenz zugeordnet ist. Und das abschließende SELECT wendet dann diesen maximalen Wert auf jede Sequenz an, indem setval() verwendet wird .

Vielleicht möchten Sie das ohne setval() ausführen Rufen Sie zuerst an, um zu sehen, ob alles so ist, wie Sie es brauchen.