1
resposta

DELETE NÃO ACATADO POR HAVER FOREIGN KEY ASSOCIADA A OUTRO CAMPO

Ao tentar realizar o exercício 06 (Excluindo Notas) do treinamento Comando DML: Manipulação de Dados com MySQL não consigo seguir com o exercício pois a tabela Notas ainda não foi carregada e está vazia.

A sugestão de comandos seria:

SELECT A.NUMERO FROM NOTAS A INNER JOIN CLIENTES B ON A.CPF = B.CPF WHERE B.IDADE <= 18

DELETE A FROM NOTAS A INNER JOIN CLIENTES B ON A.CPF = B.CPF WHERE B.IDADE <= 18

Mas como explicado acima, apenas retorna Null.

Então tentei utilizar o banco de dados sucos_vendas de duas formas:

DELETE X FROM (SELECT A.NUMERO, B.IDADE FROM sucos_vendas.notas_fiscais A INNER JOIN sucos_vendas.tabela_de_clientes B ON A.CPF = B.CPF) X WHERE B.IDADE <= 18;

Não acatado pelo erro 1288, X of the DELETE is not updatable.

E conforme acima, repliquei o comando na base sucos_vendas:

DELETE A FROM notas_fiscais A INNER JOIN tabela_de_clientes B ON A.CPF = B.CPF WHERE B.IDADE <= 18;

Desta vez o erro apresentado é o 1451 Cannot delete or update a parent row: a foreign key constraint fails (sucos_vendas.itens_notas_fiscais, CONSTRAINT itens_notas_fiscais_ibfk_2 FOREIGN KEY (NUMERO) REFERENCES notas_fiscais (NUMERO)) 0.109 sec

Até onde entendi a chave estrangeira está impossibilitando o DELETE. Basta desfazer a chave estrangeira?

Muito obrigado!

1 resposta

Olá, Ricardo!

Pelo que você descreveu, parece que você está tentando excluir registros de uma tabela que está sendo referenciada por outra através de uma chave estrangeira. Isso é uma proteção do MySQL para evitar a exclusão de dados que estão sendo usados em outra tabela, o que poderia causar inconsistências nos dados.

A solução para o seu problema depende do que você quer alcançar. Se você quer excluir os registros sem se preocupar com a referência a eles em outra tabela, você pode sim desfazer a chave estrangeira temporariamente, realizar a exclusão e depois recriá-la.

Mas, cuidado! Isso pode causar a perda de referência dos dados na tabela 'itens_notas_fiscais'. Se você tem registros nesta tabela que referenciam as notas que você está tentando excluir, esses registros ficarão sem sentido.

Para desfazer a chave estrangeira, você pode usar o seguinte comando:

ALTER TABLE itens_notas_fiscais DROP FOREIGN KEY itens_notas_fiscais_ibfk_2;

Depois de realizar a exclusão dos registros, você pode recriar a chave estrangeira com o seguinte comando:

ALTER TABLE itens_notas_fiscais
ADD CONSTRAINT itens_notas_fiscais_ibfk_2
FOREIGN KEY (NUMERO) REFERENCES notas_fiscais(NUMERO);

Lembre-se de substituir 'itens_notas_fiscais_ibfk_2' pelo nome correto da sua chave estrangeira, se for o caso.

Se você quer manter a integridade dos dados, talvez seja melhor excluir primeiro os registros da tabela 'itens_notas_fiscais' que referenciam as notas que você quer excluir, e só depois excluir as notas.

Espero ter ajudado e bons estudos!