[EMAIL PROTECTED] escreveu:

Estou executando uma carga de dados em uma base Postgre através de comandos INSERT.

Para que não houvessem problemas em relação as foreing key durante a carga utilizei o comando SET CONSTRAINTS ALL DEFERED; dentro da transação.

BEGIN;

SET CONSTRAINTS ALL DEFERRED;

INSERT INTO xxxx .......
<...>

COMMIT;

Parece que este comando não está fazendo efeito por que, no momento da carga das linhas de uma tabela que possui um auto-relacionamento, estou recebendo um erro de violação de FK.

ERROR:  insert or update on table "xxxxx" violates foreign key constraint "fk_xxxxx_autorel"
DETAIL:  Key (id_xxxxxx_pai)=(275) is not present in table "xxxxxxx".

Verifiquei dentro do script que o INSERT com a chave = 275 está 10 comandos depois do INSERT que referencia esta linha, ou seja, as linhas estão fora da ordem esperada caso a checagem da constraints estivesse sendo feita a cada INSERT (modo IMMEDIATE).

Mas se todas as linhas necessárias estão presentes no script e foi sinalizado que a verificação das constraints fosse feita somente no final da transação (modo DEFERRED), por que está dando erro?



Quando você criou sua "foreign key constraint", no CREATE TABLE ou através de ALTER TABLE, você deve ter especificado:

CONSTRAINT constraint_name DEFERRABLE INITIALLY DEFERRED

Você precisa especificar DEFERRABLE (atenção pois o default é NOT DEFERRABLE) para que o comando:
SET CONSTRAINTS ALL DEFERRED
tenha efeito em sua transação.


[]s
Osvaldo


Você quer respostas para suas perguntas? Ou você sabe muito e quer compartilhar seu conhecimento? Experimente o Yahoo! Respostas!
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a