2
respostas

[Bug] Aparente erro na aplicação do ON DELETE CASCADE

Boa tarde!

Seguindo o roteiro do vídeo "Excluindo Dados", após dar o comando de apagar os dados do cliente específico (DELETE FROM clientes WHERE id = 27) o conteúdo explica que os comandos seguintes de selecionar dados não teriam resposta, em função de termos feito a criação da tabela de clientes com a opção de ON DELETE CASCADE (trecho "Isso porque ao criar a tabela de clientes e configurar a chave estrangeira com o comando ON DELETE CASCADE").

Só que na prática, aqui não funcionou. Fui resgatar o vídeo "Criando Tabelas com Default" da primeira aula, e vi que a opção ON DELETE CASCADE só foi colocada na criação das tabelas "pedidos" e "itenspedidos". Ou seja, eu entendo que o comando só funcionaria a partir do uso de "DELETE FROM" em uma dessas tabelas, e não da tabela clientes como sugere o vídeo "excluindo dados".

Conseguiriam fazer a gentileza de confirmar se meu entendimento está correto?

De qualquer maneira, se proceder a minha indicação de erro, seria necessário revisar o vídeo e o texto da aula 1 "Criando Tabelas com Default", pois a instrutora também não usa o "on delete cascade" no vídeo.

fico no aguardo. Obrigado!

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas

Ei, Samuel! Tudo bem?

Você está no caminho certo. O ON DELETE CASCADE é definido na chave estrangeira (FK) das tabelas filhas, não na tabela pai. No caso, as tabelas pedidos (FK idcliente referenciando clientes.id) e itenspedidos (FK idpedido referenciando pedidos.id) devem ter o CASCADE configurado. Assim:

  • Deletar um cliente em clientes remove automaticamente os pedidos relacionados em pedidos.
  • Isso, por sua vez, remove os itens em itenspedidos.

Se o ON DELETE CASCADE não foi definido nas FKs de pedidos ou itenspedidos no vídeo anterior, a exclusão do cliente não afetará as tabelas filhas, contrariando o roteiro de "Excluindo Dados".

Agradecemos o feedback, repassarei para a equipe estar ciente sobre os vídeos, se quiser reforçar o seu feedback, você pode incluí-lo na pesquisa final do curso.

Conteúdo relacionado

Até mais, Samuel!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado!

Bom dia Nathalia,

Entendi a sua explicação, e com isso concluo que a minha primeira mensagem tem uma premissa errada.

Entretanto, ao verificar as tabelas filhas parece tudo ok com o "on delete cascade", mas de fato após fazer o exercício proposto de deletar o cliente, ainda não estão sendo "desdobrados" os apagamentos dos registros em "pedidos" e "itenspedidos".

Vamos ao SQL Schema de cada uma delas:

Pedidos:
CREATE TABLE pedidos (
id TEXT PRIMARY KEY,
idcliente TEXT,
datahorapedido DATETIME,
status VARCHAR(50),
FOREIGN KEY (idcliente) REFERENCES clientes(id) ON DELETE CASCADE
)

Itens pedidos:

CREATE TABLE itenspedidos (
idpedido TEXT,
idproduto TEXT,
quantidade INTEGER,
precounitario DECIMAL(10,2),
PRIMARY KEY (idpedido, idproduto),
FOREIGN KEY (idpedido) REFERENCES pedidos(id) ON DELETE CASCADE,
FOREIGN KEY (idproduto) REFERENCES produtos(id) ON DELETE CASCADE
)

Conforme comentei, depois de fazer o exercício excluindo o cliente de ID 27, ainda vejo resultados nessas duas consultas, o que não deveria estar ocorrendo pois realmente não há mais cliente de ID 27 na consulta de clientes:

SELECT * FROM pedidos WHERE idcliente = 27

SELECT * FROM itenspedidos WHERE idpedido = 451

Onde pode estar o erro neste caso?

Obrigado.