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

6 respostas
J

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

J

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

J

Mas tem outra maneira de deletar sem modificar outras tabelas?

J

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

J

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?

J

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;

J
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