Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

apagar uma linha da coluna que tem dependência de outra tabela

Bom dia. Tentando fazer alguns testes para fixar o conteúdo comecei a ter alguns problemas.

Estou com um problema na hora de apagar uma linha da minha tabela aonde quando eu tento apagar usando o comando DELETE FROM checklist WHERE id = 2 IN DELETE FROM protudo WHERE id = 2; Apresenta erro de sintax .

Nesse caso eu tenho que apagar um dado da minha tabela que tem relação com outra tabela com chave estrangeira. Obs: Tenho que colocar tudo em uma linha de comando.

Minhas tabelas:

CREATE TABLE produto( id INT NOT NULL AUTO_INCREMENT, nome VARCHAR(250) NOT NULL, PRIMARY KEY(id) );

CREATE TABLE registro( id INT NOT NULL AUTO_INCREMENT, nome VARCHAR(250) NOT NULL, PRIMARY KEY(id) );

`CREATE TABLE checklist( id INT NOT NULL AUTO_INCREMENT, nome VARCHAR(250) NOT NULL, descricao VARCHAR(250) NOT NULL, id_produto INT NOT NULL, id_registro INT NOT NULL, PRIMARY KEY(id), FOREIGN KEY (id_produto) REFERENCES produto (id), FOREIGN KEY (id_registro) REFERENCES registro (id) );

3 respostas

Oii Thayron, tudo bem?

Pelo que entendi, você quer apagar uma linha da tabela checklist buscando pelo id do produto, certo? Você pode fazer isso usando um join, segue:

DELETE c FROM checklist c 
LEFT OUTER JOIN produto p ON c.id_produto = p.id
WHERE p.id = 2;

Espero que dessa forma te ajude. Me avise qualquer coisa, tá bom? :D

Boa tarde Maria Gabriela Cuenca Oliva, tudo bem sim.

Na verdade, me expressei mal eu acho.

Eu tenho que apagar um registro da tabela pai que tem relação com a tabela filha. Nesse caso eu tenho que apagar um registro da tabela produto (PAI), e também apagar as dependências dele que ficar na tabela checklist(FILHO).

Quando tento apagar direto na tabela produto apresenta o seguinte:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`anadin`.`checklist`, CONSTRAINT `checklist_ibfk_1` FOREIGN KEY (`id_produto`) REFERENCES `produto` (`id`))

Estava pesquisando uma forma de apagar de forma recursiva mas não encontrei nada. Queria achar uma forma de apagar uma linha da tabela produto e logo em seguida usando o mesmo comando apagar as relações que estão na tabela checklist.

solução!

Thayron, tudo bem?

No caso, você tem que criar a sua tabela checklist com a cláusula ON DELETE CASCADE.

ON DELETE significa que a ação referencial será executada quando um registro for excluído da tabela pai. A opção CASCADE permite excluir ou atualizar os registros relacionados presentes na tabela filha automaticamente, quando um registro da tabela pai for atualizado (ON UPDATE) ou excluído (ON DELETE). É a opção mais comum aplicada.

Você pode recriar a tabela dessa forma:

CREATE TABLE checklist( 
id INT NOT NULL auto_increment PRIMARY KEY, 
nome VARCHAR(250) NOT NULL, 
descricao VARCHAR(250) NOT NULL, 
id_produto INT NOT NULL, 
id_registro INT NOT NULL, 
FOREIGN KEY (id_produto)
REFERENCES produto(id)
ON DELETE CASCADE,
FOREIGN KEY (id_registro)
REFERENCES registro(id)
ON DELETE CASCADE
)

Dessa forma, ao deletar o registro da tabela pai, o registro da tabela filha também será deletado.

Espero ter conseguido explicar. Qualquer dúvida é só falar, tá bom? :D