sql >> Databáze >  >> RDS >> PostgreSQL

Jak hromadně aktualizovat sekvenční ID postgreSQL pro všechny tabulky

Za předpokladu, že všechny použité sekvence jsou vlastněny příslušnými sloupci, např. prostřednictvím serial nebo identity Tento atribut můžete použít k resetování všech (vlastněných) sekvencí v aktuální databázi.

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;

První část vybere všechny sekvence vlastněné sloupcem. Druhá část pak používá query_to_xml() získat maximální hodnotu pro sloupec spojený s danou sekvencí. A konečný SELECT pak aplikuje tuto maximální hodnotu na každou sekvenci pomocí setval() .

Možná to budete chtít spustit bez setval() nejprve zavolejte, abyste zjistili, zda je vše, jak potřebujete.



  1. Změnit výchozí znakovou sadu MySQL na UTF-8 v my.cnf?

  2. Jak nasadit databázi Chamilo MySQL pro vysokou dostupnost

  3. Definice schémat pomocí DBMS

  4. Jak vygenerovat GUID v Oracle?