sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man massuppdateringar sekvens-ID postgreSQL för alla tabeller

Om man antar att alla använda sekvenser ägs av respektive kolumner, t.ex. genom en serial eller identity attribut, kan du använda detta för att återställa alla (ägda) sekvenser i den aktuella databasen.

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örsta delen väljer alla sekvenser som ägs av en kolumn. Den andra delen använder sedan query_to_xml() för att få maxvärdet för kolumnen som är kopplad till den sekvensen. Och den slutliga SELECT tillämpar sedan det maxvärdet på varje sekvens med setval() .

Du kanske vill köra det utan setval() ring först för att se om allt är som du behöver.



  1. Lagring av långa binära (rådata) strängar

  2. Vad är användningen av hakparenteser [] i sql-satser?

  3. Åtgärda felet "ORA-01789:frågeblocket har felaktigt antal resultatkolumner"

  4. Kan en sql-servertabell ha två identitetskolumner?