Giả sử rằng tất cả các trình tự đã sử dụng đều thuộc sở hữu của các cột tương ứng, ví dụ:thông qua một serial
hoặc identity
, bạn có thể sử dụng thuộc tính này, để đặt lại tất cả các chuỗi (sở hữu) trong cơ sở dữ liệu hiện tại.
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;
Phần đầu tiên chọn tất cả các chuỗi thuộc sở hữu của một cột. Sau đó, phần thứ hai sử dụng query_to_xml()
để nhận giá trị tối đa cho cột được liên kết với trình tự đó. Và sau đó SELECT cuối cùng áp dụng giá trị tối đa đó cho từng chuỗi bằng cách sử dụng setval()
.
Bạn có thể muốn chạy mà không có setval()
gọi trước để xem mọi thứ có như bạn cần không.