Erro Pk Duplicada Apos Restore Postgres

Bom Dia, Estou fazendo implementações de Backup E restauração.

Mas Percebi que após restaurar , ao tentar incluir um registro ele Barra no erro:

Duplicar o valor da chave Viola a restrição de unicidade...

Achei estranho e fui verificar PGAdmin.
Tinha apenas 3 registros na tabela, com o ID(pk) na sequencia 75,76,77…
Mas ao tentar incluir ele tenta jogar no ID 75, e não no 78 como deveria ser…

Acho que para resolver isso tenho que atualizar minha sequencia… Como Faço isso?

Abraços!

Coincidência… ainda hoje pela manhã eu e um colega conversávamos sobre isso.

Veja essa documentação, me parece que o SETVAL faz o que você precisa:

http://www.postgresql.org/docs/8.1/static/functions-sequence.html

select setval('nome_da_sequencia', numero_do_id);

Mas um restore deveria copiar a sequência também. :roll:

Boa tarde… Muito estranho mesmo… Tanto que antes de fazer o restore eu Mando apagar as Tabelas e As Sequencias Atuais.

Sobre o Setval, eu já havia lido a documentação sobre ele, mas como vou saber em qual id colocar?
Vou ter que dar um select e verificar o ultimo número toda vez? ou Tem algo mas simples?

[quote=samuk]Boa tarde… Muito estranho mesmo… Tanto que antes de fazer o restore eu Mando apagar as Tabelas e As Sequencias Atuais.

Sobre o Setval, eu já havia lido a documentação sobre ele, mas como vou saber em qual id colocar?
Vou ter que dar um select e verificar o ultimo número toda vez? ou Tem algo mas simples?[/quote]

Pois é, se o backup não recupera o valor da sequência teria que fazer isso em todo backup. =S

Mas tem algo de errado com ele. Você tá fazendo o backup pelo pgAdmin? Ele tem umas opções lá na hora de tirar o backup, dá uma olhada pra ver se não tem algo relacionado.

Eu costumo fazer pelo terminal, um simples pg_dump, funciona muito bem. :smiley:

Criei Uma Classe Que faz isso:
De uma Olhada se é algo de errado Por Favor!

[code]package funcoes;

import javax.swing.JOptionPane;

import classePrincipal.DaoPrincipal;
import classesCombustivel.DaoCombustivel;
import classesDizimo.DaoDizimo;

public class Backup {
DaoPrincipal daoPrincipal = new DaoPrincipal();
DaoCombustivel daoCombustivel = new DaoCombustivel();
DaoDizimo daoDizimo = new DaoDizimo();

static String DataBase = "DatabaseControlesTeste";
public void backup(){
	
	try{  
		ProcessBuilder pb;  
		@SuppressWarnings("unused")
		Process p;  
		pb = new ProcessBuilder("C:/a/pg_dump.exe ", "-i", "--username", "postgres" , "--format", "custom", "--blobs", "--file", "D:\\Teste200.backup",DataBase);  
		pb.environment().put("PGPASSWORD", "PSsistemas");  
		pb.redirectErrorStream(true);  
		p = pb.start();
		}catch(Exception ex){  
		    JOptionPane.showMessageDialog(null, ex);  
		}  

}

public void restore(){
	if (!daoPrincipal.verificaDatabase()) {
		daoPrincipal.criarDatabase();
	}
	if (daoCombustivel.verificaTabela()){
		daoCombustivel.excluirTabela();
	}
	if (daoDizimo.verificaTabela()){
		daoDizimo.excluirTabela();
	}
	
	try{  
		ProcessBuilder pb;  
		@SuppressWarnings("unused")
		Process p;  
		pb = new ProcessBuilder("C:/a/pg_restore.exe ", "-i", "--username", "postgres" ,"--dbname" ,""+DataBase , "D:\\Teste200.backup");

		pb.environment().put("PGPASSWORD", "PSsistemas");  
		pb.redirectErrorStream(true);  
		p = pb.start();   
		}catch(Exception ex){  
		    JOptionPane.showMessageDialog(null, ex);  
		}  

}

} [/code]

Amigo, acho que estou com a mesma dúvida que você. Quando vou fazer o restore, me retorna vários erros como este:

pg_restore: criando FK CONSTRAINT solicitacao_emp_cod_fkey
pg_restore: [arquivador (bd)] Erro no registro do TOC 1963; 2606 24640 FK CONSTRAINT solicitacao_emp_cod_fkey postgres
pg_restore: [arquivador (bd)] could not execute query: ERRO: restrição “solicitacao_emp_cod_fkey” para relação “licenca” já existe
Comando foi: ALTER TABLE ONLY licenca
ADD CONSTRAINT solicitacao_emp_cod_fkey FOREIGN KEY (emp_cod) REFERENCES empresa(emp_cod);
AVISO: erros ignorados durante restauração: 27

pelo que entendi, ele está tentando gravar por cima da base já criada.
Eu devo excluir a base que está rodando para depois substituir?
O que devo fazer? Valeu!