PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да актуализирате групово последователност ID postgreSQL за всички таблици

Ако приемем, че всички използвани последователности са собственост на съответните колони, напр. чрез serial или identity атрибут, можете да използвате това, за да нулирате всички (собствени) последователности в текущата база данни.

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;

Първата част избира всички последователности, притежавани от колона. След това втората част използва query_to_xml() за да получите максималната стойност за колоната, свързана с тази последователност. И последният SELECT след това прилага тази максимална стойност към всяка последователност, използвайки setval() .

Може да искате да го стартирате без setval() първо се обадете, за да видите дали всичко е както трябва.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как sqrt() работи в PostgreSQL

  2. Сортиране на елементи от масива

  3. Лош дизайн ли е да се използват масиви в база данни?

  4. Стартиране и попълване на контейнер Postgres в Docker

  5. Postgresql извлича последния ред за всеки идентификатор