Existe alguma boa explicação de como usar a construção de chave estrangeira do MySQL?
Eu não entendi muito bem nos próprios documentos do MySQL. Até agora, tenho lidado com coisas como chaves estrangeiras com joins e código de programação.
E a segunda parte da pergunta, há alguma melhoria a ser feita usando as chaves estrangeiras integradas do MySQL?
A lentidão é mínima, porque você geralmente faz FK em campos indexados, o que torna a localização dos valores relevantes muito rápida.
Seb,
4
É por isso que escrevi "um pouco" :) Na verdade, se você deletar muitos registros, o subjacente JOINpode ser muito menos eficiente que dois DELETE usando FULL TABLE SCAN
Quassnoi
2
Desculpe pelo voto negativo. Foi acidental, mas não me permite mudar o meu voto.
Wondercricket de
8
@Wondercricket: Eu nem sei o que fazer agora, é uma área cinzenta nas regras do site. Acho que você me compra uma cerveja quando está em Moscou e estamos quites.
Quassnoi,
1
@stack: qualquer atualização que você fizer nas cascatas de chaves referenciadas para a tabela de referência.
Quassnoi
32
Os principais benefícios de usar chaves estrangeiras reais são garantir a integridade dos dados e ser capaz de configurar ações em cascata em itens relacionados quando algo é modificado ou excluído.
Por exemplo, imagine que você está programando um fórum. Você tem uma tabela de "tópicos" com chave primária topics.topic_ide uma tabela de "postagens" na qual as postagens são anexadas aos tópicos com a coluna posts.topic_id, que é uma chave estrangeira para a tabela de tópicos.
Esse relacionamento de chave estrangeira garante que cada postagem seja anexada a um tópico válido. Se o único tópico que você possui possui ID # 1, é impossível que exista uma postagem no banco de dados anexada ao tópico # 2. O banco de dados garante isso.
Para benefício em cascata, você pode configurá-lo de forma que, se um tópico for excluído da tabela de tópicos, o banco de dados exclui automaticamente todas as postagens na tabela de postagens que foram anexadas a este tópico. Isso é bom porque remove uma etapa que você deve se lembrar de fazer manualmente, que pode se tornar bastante complexa quando você tem muitas tabelas vinculadas. Com as chaves estrangeiras, todos os relacionamentos podem ser limpos automaticamente.
1.FOREIGN KEYS apenas certifique-se de que seus dados são consistentes.
2. Se aplicarmos em cascata de exclusão à definição de chave estrangeira, a linha de referência será excluída automaticamente quando a linha pai for excluída.
3. Se aplicarmos Update Cascade à definição de chave estrangeira, a linha filho será atualizada automaticamente quando a linha pai for atualizada.
Consulta: ALTER TABLE filho ADD FOREIGN KEY (parent_id) REFERÊNCIAS pai (id) ON UPDATE CASCADE ON DELETE CASCADE;
você não pode excluir a tabela pai direta, primeiro exclua a chave estrangeira da tabela filho do que excluir a tabela pai.
Finalmente percebi o que me confundia sobre os exemplos de chave estrangeira. Como pai de quatro filhos, não estou acostumado com a criança acompanhando o pai . Em outros quarenta anos ou mais, isso pode não parecer mais para trás.
Bob Stein
1
Obrigado por dar nomes às suas tabelas de exemplo como "filho" e "pai" ... na verdade é bastante útil e gostaria que a documentação oficial o fizesse!
roedor de microfone
7
A principal vantagem é que você pode limitar os valores que pode inserir na tabela; se você tentar inserir um valor que não existe na tabela referenciada, você não conseguirá fazê-lo.
Além disso, se você atualizar ou excluir o valor na tabela referenciada, poderá configurá-lo para atualizar automaticamente o valor ou excluir em cascata qualquer linha que contenha esse valor.
Na verdade, é um ótimo recurso para alavancar seu código.
JOIN
pode ser muito menos eficiente que dois DELETE usando FULL TABLE SCANOs principais benefícios de usar chaves estrangeiras reais são garantir a integridade dos dados e ser capaz de configurar ações em cascata em itens relacionados quando algo é modificado ou excluído.
Por exemplo, imagine que você está programando um fórum. Você tem uma tabela de "tópicos" com chave primária
topics.topic_id
e uma tabela de "postagens" na qual as postagens são anexadas aos tópicos com a colunaposts.topic_id
, que é uma chave estrangeira para a tabela de tópicos.Esse relacionamento de chave estrangeira garante que cada postagem seja anexada a um tópico válido. Se o único tópico que você possui possui ID # 1, é impossível que exista uma postagem no banco de dados anexada ao tópico # 2. O banco de dados garante isso.
Para benefício em cascata, você pode configurá-lo de forma que, se um tópico for excluído da tabela de tópicos, o banco de dados exclui automaticamente todas as postagens na tabela de postagens que foram anexadas a este tópico. Isso é bom porque remove uma etapa que você deve se lembrar de fazer manualmente, que pode se tornar bastante complexa quando você tem muitas tabelas vinculadas. Com as chaves estrangeiras, todos os relacionamentos podem ser limpos automaticamente.
fonte
1.FOREIGN KEYS apenas certifique-se de que seus dados são consistentes.
2. Se aplicarmos em cascata de exclusão à definição de chave estrangeira, a linha de referência será excluída automaticamente quando a linha pai for excluída.
3. Se aplicarmos Update Cascade à definição de chave estrangeira, a linha filho será atualizada automaticamente quando a linha pai for atualizada.
Consulta: ALTER TABLE filho ADD FOREIGN KEY (parent_id) REFERÊNCIAS pai (id) ON UPDATE CASCADE ON DELETE CASCADE;
fonte
A principal vantagem é que você pode limitar os valores que pode inserir na tabela; se você tentar inserir um valor que não existe na tabela referenciada, você não conseguirá fazê-lo.
Além disso, se você atualizar ou excluir o valor na tabela referenciada, poderá configurá-lo para atualizar automaticamente o valor ou excluir em cascata qualquer linha que contenha esse valor.
Na verdade, é um ótimo recurso para alavancar seu código.
fonte