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

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!!!

[code]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’;[/code]

Está correto?

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

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?

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

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

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?

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

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?[/quote]
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;

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

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?[/quote]
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; [/quote]

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.

[code]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’;[/code]
[RESOLVIDO]