[RESOLVIDO] ORA-02292: restrição de integridade

6 respostas
Jericho

Pessoal eu tenho a seguinte tabela:

CREATE TABLE editora
  (edi_codigo NUMBER (10), edi_nome VARCHAR2(70) NOT NULL
  );
CREATE TABLE autor
  (
    aut_matricula      NUMBER (10),
    aut_nome           VARCHAR2 (50) NOT NULL,
    aut_cpf            VARCHAR2(12) NOT NULL,
    aut_dtnasc         DATE NOT NULL,
    aut_nascionalidade VARCHAR2(30)
  );
CREATE TABLE livro
  (
    liv_codigo     NUMBER(10),
    liv_titulo     VARCHAR2(70),
    liv_preco      NUMBER(7,2),
    liv_lancamento DATE,
    edi_codigo     NUMBER(10),
    ass_sigla      CHAR(3) NOT NULL
  );
CREATE TABLE assunto
  (ass_sigla CHAR(3), ass_descricao VARCHAR2 (20)
  );
ALTER TABLE editora ADD
(
  CONSTRAINT editora_edi_codigo_pk PRIMARY KEY(edi_codigo)
)
;
ALTER TABLE livro ADD
(
  CONSTRAINT livro_liv_codigo_pk PRIMARY KEY (liv_codigo)
)
;
ALTER TABLE autor ADD
(
  CONSTRAINT autor_aut_matricula_pk PRIMARY KEY (aut_matricula)
)
;
ALTER TABLE assunto ADD
(
  CONSTRAINT assunto_ass_sigla_pk PRIMARY KEY(ass_sigla)
)
;
ALTER TABLE livro ADD
(
  CONSTRAINT livro_edi_codigo_fk FOREIGN KEY(edi_codigo) REFERENCES editora(edi_codigo)
)
;
ALTER TABLE livro ADD
(
  CONSTRAINT livro_ass_sigla_fk FOREIGN KEY (ass_sigla) REFERENCES assunto(ass_sigla)
)
;
CREATE TABLE escreve
  (
    liv_codigo    NUMBER(10),
    aut_matricula NUMBER (10),
    CONSTRAINT escreve_liv_aut_pk PRIMARY KEY(liv_codigo,aut_matricula),
    CONSTRAINT escreve_liv_codigo_fk FOREIGN KEY (liv_codigo) REFERENCES livro (liv_codigo),
    CONSTRAINT escreve_liv_aut_matricula_fk FOREIGN KEY (aut_matricula) REFERENCES autor(aut_matricula)
  );

Até então eu quero fazer um delete

Excluir o livro cujo título é Banco de Dados Distribuído ou Banco de Dados para WEB. Somente estas 2 opções devem ser consideradas;

DELETE
FROM livro
WHERE liv_titulo = 'banco de dados distribuído'
OR liv_titulo    = 'banco de dados para a web';

E então apresenta esse erro:

Relatório de erro:
Erro de SQL: ORA-02292: restrição de integridade (ESCREVE_LIV_CODIGO_FK) violada - registro filho localizado
02292. 00000 - "integrity constraint (%s.%s) violated - child record found"
*Cause: attempted to delete a parent key value that had a foreign dependency.
*Action: delete dependencies first then parent or disable constraint.

E então eu fiz dessa maneira e deu certo!!!

DELETE
FROM escreve
WHERE liv_codigo = 1;

DELETE
FROM livro
WHERE liv_titulo = 'banco de dados distribuído'
OR liv_titulo    = 'banco de dados para a web';
Está correto?

Pois o meu professor diz "uma coisa é funcionar outra é estar certo"

6 Respostas

javaflex

Depende da necessidade do cliente, se quer que o sistema apague em cascata os registros relacionados ou exiba mensagem de validação.

Jericho

Mas tem outra maneira de deletar sem modificar outras tabelas?

javaflex

Mas tem outra maneira de deletar sem modificar outras tabelas?
Como assim? Explique melhor para a prática.

Jericho

Mas tem outra maneira de deletar sem modificar outras tabelas?
Como assim? Explique melhor para a prática.

E que eu peguei as tabelas criadas e então não posso modificá-las.

Tem algum jeito de fazer executar apenas com um comando delete sem alterar mais nada?

javaflex

Mas tem outra maneira de deletar sem modificar outras tabelas?
Como assim? Explique melhor para a prática.

E que eu peguei as tabelas criadas e então não posso modificá-las.

Tem algum jeito de fazer executar apenas com um comando delete sem alterar mais nada?
Sem alterar nada não tem como. Isto é justamente para não deixar a base inconsistente. Dá uma lida sobre integridade referencial. Se dropar ou desabilitar a constraint da FK vai conseguir apagar o registro sem precisar deletar os outros relacionados, mas esses dados ficarão inconsistentes.

Este exemplo seria uma saída, mas não recomendo:

ALTER TABLE table_name disable CONSTRAINT constraint_name;

Jericho
javaflex:
Jericho:
javaflex:
Jericho:
javaflex:
Depende da necessidade do cliente, se quer que o sistema apague em cascata os registros relacionados ou exiba mensagem de validação.

Mas tem outra maneira de deletar sem modificar outras tabelas?


Como assim? Explique melhor para a prática.

E que eu peguei as tabelas criadas e então não posso modificá-las.

Tem algum jeito de fazer executar apenas com um comando delete sem alterar mais nada?


Sem alterar nada não tem como. Isto é justamente para não deixar a base inconsistente. Dá uma lida sobre integridade referencial. Se dropar ou desabilitar a constraint da FK vai conseguir apagar o registro sem precisar deletar os outros relacionados, mas esses dados ficarão inconsistentes.

Este exemplo seria uma saída, mas não recomendo:
ALTER TABLE table_name
disable CONSTRAINT constraint_name;

Ok, eu entendi, muito obrigado!

Enfim...

Excluir o livro cujo título é Banco de Dados Distribuído ou Banco de Dados para WEB. Somente estas 2 opções devem ser consideradas;

Como eu não posso fazer alterações nas 'regras' da tabela acima vou deixar da maneira que eu tinha feito.

DELETE
FROM escreve
WHERE liv_codigo = 1;

DELETE
FROM livro
WHERE liv_titulo = 'banco de dados distribuído'
OR liv_titulo    = 'banco de dados para a web';
[RESOLVIDO]
Criado 18 de março de 2013
Ultima resposta 18 de mar. de 2013
Respostas 6
Participantes 2