Como posso transferir para o outro banco de dados PostgreSQL o
último valor atribuído do campo “incremento automático” do tipo serial, se houver alguma exclusão na tabela, e “apenas substituir max (pk)” não funcionar mais?
Poucas pessoas sabem que, embora o PG não forneça
funções da versão 10
para descobrir o último valor de sequência para esse campo
em outra sessão , isso ainda pode ser feito.

O PostgreSQL suporta campos de "incremento automático" definidos pelo
pseudótipo serial :
Os tipos de dados smallserial, serial e bigserial não são tipos reais, mas são apenas uma ferramenta conveniente para criar colunas com identificadores exclusivos (semelhantes à propriedade AUTO_INCREMENT em alguns DBMSs).
Tecnicamente, isso é apenas um link automático da definição DEFAULT para o campo e os valores gerados pelo objeto
SEQUENCE . E, às vezes, quero examinar esses valores - por exemplo,
transferi-los para um banco de dados de estrutura semelhante .
Mas isso não é fácil de fazer:
currval
Retorna o valor retornado da última chamada nextval para esta sequência na sessão atual. (Se nextval nunca tiver sido chamado para uma determinada sequência em uma determinada sessão, um erro será retornado.) Como esse valor é limitado pelo escopo da sessão, essa função fornece um resultado previsível, independentemente de o nextval ter sido chamado posteriormente em outras sessões ou não.
Vamos tentar extrair essas informações, no entanto:
CREATE TABLE tst( id serial
TABLE tst;
id | val -------- 1 | 1 2 | 2 3 | 4 4 | 8
Este é o valor
id = 4
que queremos obter. Mas alguém excluiu parte dos registros e, na tabela, não existe mais:
DELETE FROM tst WHERE id > 2;
id | val -------- 1 | 1 2 | 2
Primeiro, descobriremos o nome da sequência correspondente ao nosso campo:
SELECT pg_get_serial_sequence('tst', 'id');
pg_get_serial_sequence ---------------------- public.tst_id_seq
Agora use o
nome da sequência resultante
como uma tabela na consulta:
SELECT * FROM public.tst_id_seq;
last_value | log_cnt | is_called -------------------------------- 4 | 29 | t
Na verdade, o campo
last_value também armazena o valor “last” que a sequência conseguiu gerar no momento da nossa chamada.
Agora vamos criar um script simples para transferir valores de sequência de um banco de dados para outro usando
o módulo dblink :
Mas lembre-se de que, se houver alguma atividade na base de origem, o resultado será indefinido!