PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zbiorczo zaktualizować identyfikator sekwencji postgreSQL dla wszystkich tabel?

Zakładając, że wszystkie użyte sekwencje należą do odpowiednich kolumn, np. przez serial lub identity atrybut, możesz użyć tego, aby zresetować wszystkie (własne) sekwencje w bieżącej bazie danych.

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;

Pierwsza część wybiera wszystkie sekwencje należące do kolumny. Druga część używa następnie query_to_xml() aby uzyskać maksymalną wartość dla kolumny powiązanej z tą sekwencją. A końcowy SELECT następnie stosuje tę maksymalną wartość do każdej sekwencji za pomocą setval() .

Możesz chcieć uruchomić to bez setval() najpierw zadzwoń, aby sprawdzić, czy wszystko jest tak, jak potrzebujesz.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pandy aktualizacja sql

  2. Czy SELECT lub INSERT w funkcji podatne na wyścigi?

  3. Najlepsze rozwiązania wysokiej dostępności w klastrach PG dla PostgreSQL

  4. Jak zaktualizować PostgreSQL 11 do PostgreSQL 12 bez przestojów?

  5. Jak nawiązać połączenie z Postgresem przez Node.js