Trabalhando com Restrições de Chave Estrangeira
Nesta etapa final, exploraremos como as restrições de chave estrangeira ajudam a manter a integridade dos dados entre tabelas relacionadas. As restrições de chave estrangeira garantem que os relacionamentos entre as tabelas permaneçam válidos, impedindo operações que criariam registros órfãos ou dados inconsistentes.
Vamos tentar entender como as restrições de chave estrangeira funcionam por meio de alguns exemplos:
Primeiro, vamos tentar adicionar um livro com um author_id inválido:
-- This will fail due to foreign key constraint
INSERT INTO books (title, author_id, publisher_id, publication_year, price)
VALUES ('Failed Book', 999, 1, 2023, 29.99);
Você verá uma mensagem de erro porque author_id 999 não existe na tabela authors:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bookstore`.`books`, CONSTRAINT `books_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`author_id`))
Esta mensagem de erro indica que a restrição de chave estrangeira na coluna author_id na tabela books está nos impedindo de adicionar um livro que referencia um author_id que não existe na tabela authors.
Da mesma forma, não podemos excluir um autor que publicou livros sem primeiro lidar com seus livros:
-- This will fail due to foreign key constraint
DELETE FROM authors WHERE author_id = 1;
Tentar excluir o autor com author_id = 1 diretamente resulta em um erro de chave estrangeira porque há livros que referenciam esse author_id. Esta é a maneira do MySQL de garantir que seus dados permaneçam consistentes.
Para excluir com segurança um autor e seus livros, precisamos:
- Excluir os livros primeiro, depois o autor. Isso garante que não tenhamos registros órfãos.
- Usar
CASCADE DELETE (que exploraremos em laboratórios avançados).
Vamos ver como remover corretamente um livro e seu autor excluindo o livro primeiro:
-- First, delete the books by this author
DELETE FROM books WHERE author_id = 1;
-- Now we can safely delete the author
DELETE FROM authors WHERE author_id = 1;
Ao excluir os livros primeiro, você está removendo as referências de chave estrangeira, permitindo que o autor seja excluído sem violar as restrições.