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.