Noções básicas de chaves estrangeiras no MySQL?

91

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?

Macha
fonte

Respostas:

117

FOREIGN KEYS apenas certifique-se de que seus dados sejam consistentes.

Eles não melhoram as consultas em termos de eficiência, apenas fazem com que algumas consultas erradas falhem.

Se você tem um relacionamento como este:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, então você não poderá excluir um departmentse ele tiver algum employee.

Se você fornecer ON DELETE CASCADEa FOREIGN KEYdefinição, as linhas de referência serão excluídas automaticamente junto com as referenciadas.

Como uma restrição, FOREIGN KEYna verdade retarda um pouco as consultas.

Verificação extra precisa ser realizada ao excluir de uma tabela referenciada ou inserir em uma referência.

Quassnoi
fonte
1
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.

Chad Birch
fonte
11

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;

  1. você não pode excluir a tabela pai direta, primeiro exclua a chave estrangeira da tabela filho do que excluir a tabela pai.
Gaurav Kumar
fonte
7
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.

Seb
fonte