sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan masseopdateringer sekvens-id postgreSQL for alle tabeller

Forudsat at alle brugte sekvenser ejes af de respektive kolonner, f.eks. gennem en serial eller identity attribut, kan du bruge denne til at nulstille alle (ejede) sekvenser i den aktuelle database.

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;

Den første del vælger alle sekvenser, der ejes af en kolonne. Den anden del bruger så query_to_xml() for at få den maksimale værdi for den kolonne, der er knyttet til den sekvens. Og det sidste SELECT anvender derefter den maksimale værdi på hver sekvens ved hjælp af setval() .

Du vil måske køre det uden setval() ring først for at se, om alt er, som du har brug for.



  1. Fejlfinding af SQL Server Always On Availability Groups

  2. Konfiguration af MySQL 8

  3. Hvordan får man poster tilfældigt fra Oracle-databasen?

  4. Top MySQL-blogs og -websteder for databaseadministratorer