Delete em Cascada em Tabela com Auto Relacionamento

6 respostas
A

Pessoal,

não sei se é uma coisa simples. Porém eu tenho uma tabela que possui um auto relacionamento, e quando tento usar o comando delete ocorre erro de check constraint.

Banco: PostgreSQL

Segue a tabela abaixo:

CREATE TABLE t06_ator
(
  identificador serial NOT NULL,
  nome character varying(30) NOT NULL,
  id_generalizacao integer,
  projeto integer NOT NULL,
  CONSTRAINT t06_ator_pk PRIMARY KEY (identificador),
  CONSTRAINT ator_projeto_fk FOREIGN KEY (projeto)
      REFERENCES t01_projeto (codigo) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT id_gen_identificador_fk FOREIGN KEY (id_generalizacao)
      REFERENCES t06_ator (identificador) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
) 
WITHOUT OIDS;
ALTER TABLE t06_ator OWNER TO postgres;

Dados:

Comando executado:
delete from t06_ator where projeto = 1

Erro:
ERROR: update or delete on table “t06_ator” violates foreign key constraint “id_gen_identificador_fk” on table “t06_ator”

Solução:
Procuro algum jeito de realizar o delete em cascata, para não ocorrer o erro de deletar os registros pais antes dos filhos…

Alguem me ajuda ??

6 Respostas

V

Troque o ON DELETE NO ACTION por ON DELETE CASCADE onde for necessário.

Ou delete a tabela de referência antes (eu prefiro fazer manualmente, justamente para evitar o risco de uma cagada destruir metade do BD).

A

Obrigado pela resposta,

mas eu já botei ON DELETE CASCADE nas duas FKs existentes e não funcionou. tipo assim:

view plaincopy to clipboardprint?
CREATE TABLE t06_ator   
(   
  identificador serial NOT NULL,   
  nome character varying(30) NOT NULL,   
  id_generalizacao integer,   
  projeto integer NOT NULL,   
  CONSTRAINT t06_ator_pk PRIMARY KEY (identificador),   
  CONSTRAINT ator_projeto_fk FOREIGN KEY (projeto)   
      REFERENCES t01_projeto (codigo) MATCH SIMPLE   
      ON UPDATE NO ACTION ON DELETE CASCADE,   
  CONSTRAINT id_gen_identificador_fk FOREIGN KEY (id_generalizacao)   
      REFERENCES t06_ator (identificador) MATCH SIMPLE   
      ON UPDATE NO ACTION ON DELETE CASCADE)   
WITHOUT OIDS;   
ALTER TABLE t06_ator OWNER TO postgres;

Ficou faltando alguma coisa?

Vc disse:
[color=red]Ou delete a tabela de referência antes[/color]

O problema é que a tabela de referência é a mesma, por ser um auto relacionamento. Então nesse caso eu não tenho como prever se um registro está relacionado a outro ou a vários.

V

Eu tenho algo parecido no meu banco. Acabei colocando o servidor de aplicação para fazer a recursão e achar os ids que deveriam ser deletados anteriormente.

No SQL-Server, existe uma cláusula chamada WITH, que permite essa exclusão em árvore. No Postgre não sei te dizer se existe algo similar.

A

tem esse algoritimo de recursão ai ??

V

Não, fiz no trabalho, ficou na empresa. E é em C#, não em Java. Usando as classes de negócio.

A

humm vou ter que me virar aqui então. Obrigado.

Criado 20 de novembro de 2010
Ultima resposta 21 de nov. de 2010
Respostas 6
Participantes 2