101 lines
4.9 KiB
Markdown
101 lines
4.9 KiB
Markdown
|
---
|
||
|
title: SQL Foreign Key Constraint
|
||
|
localeTitle: Restrição de chave estrangeira do SQL
|
||
|
---
|
||
|
## Restrição de chave estrangeira do SQL
|
||
|
|
||
|
Uma chave estrangeira é uma chave usada para vincular duas tabelas. A tabela com a restrição de chave estrangeira (também conhecida como "tabela filho") está conectada a outra tabela (também conhecida como "tabela pai"). A conexão é entre a restrição de chave externa da tabela filha e a chave primária da tabela pai.
|
||
|
|
||
|
Restrições de chave estrangeira são usadas para ajudar a manter a consistência entre as tabelas. Por exemplo, se um registro de tabela pai for excluído e a tabela filha tiver registros, o sistema também poderá excluir os registros filhos.
|
||
|
|
||
|
Eles também ajudam a evitar a inserção de dados imprecisos na tabela filha, exigindo que exista um registro de tabela pai para cada registro inserido na tabela filha.
|
||
|
|
||
|
### Exemplo de uso
|
||
|
|
||
|
Para este guia, vamos dar uma olhada mais de perto nas tabelas de alunos (pais) e de alunos (child).
|
||
|
|
||
|
### A chave primária da tabela pai
|
||
|
|
||
|
Observe que a tabela do aluno tem uma chave primária de uma coluna de studentID.
|
||
|
|
||
|
```sql
|
||
|
SHOW index FROM student;
|
||
|
```
|
||
|
|
||
|
```text
|
||
|
+---------+------------+----------+--------------+-------------+
|
||
|
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
|
||
|
+---------+------------+----------+--------------+-------------+
|
||
|
| student | 0 | PRIMARY | 1 | studentID |
|
||
|
+---------+------------+----------+--------------+-------------+
|
||
|
1 row in set (0.00 sec) (some columns removed on the right for clarity)
|
||
|
```
|
||
|
|
||
|
### Chaves primárias e externas da tabela filho
|
||
|
|
||
|
A tabela de informações de contato do aluno possui uma chave primária que também é o studentID. Isso ocorre porque há um relacionamento um-para-um entre as duas tabelas. Em outras palavras, esperamos apenas um registro de contato de aluno e um aluno por aluno.
|
||
|
|
||
|
```sql
|
||
|
SHOW index FROM `student-contact-info`;
|
||
|
```
|
||
|
|
||
|
```text
|
||
|
+----------------------+------------+----------+--------------+-------------+
|
||
|
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
|
||
|
+----------------------+------------+----------+--------------+-------------+
|
||
|
| student-contact-info | 0 | PRIMARY | 1 | studentID |
|
||
|
+----------------------+------------+----------+--------------+-------------+
|
||
|
1 row in set (0.00 sec) (some columns removed on the right for clarity)
|
||
|
```
|
||
|
|
||
|
```sql
|
||
|
SELECT concat(table_name, '.', column_name) AS 'foreign key',
|
||
|
concat(referenced_table_name, '.', referenced_column_name) AS 'references'
|
||
|
FROM information_schema.key_column_usage
|
||
|
WHERE referenced_table_name IS NOT NULL
|
||
|
AND table_schema = 'fcc_sql_guides_database'
|
||
|
AND table_name = 'student-contact-info';
|
||
|
```
|
||
|
|
||
|
```text
|
||
|
+--------------------------------+-------------------+
|
||
|
| foreign key | references |
|
||
|
+--------------------------------+-------------------+
|
||
|
| student-contact-info.studentID | student.studentID |
|
||
|
+--------------------------------+-------------------+
|
||
|
1 row in set (0.00 sec)
|
||
|
```
|
||
|
|
||
|
### Exemplo de relatório usando a tabela pai do aluno e a tabela filha de contato
|
||
|
|
||
|
```sql
|
||
|
SELECT a.studentID, a.FullName, a.programOfStudy,
|
||
|
b.`student-phone-cell`, b.`student-US-zipcode`
|
||
|
FROM student AS a
|
||
|
JOIN `student-contact-info` AS b ON a.studentID = b.studentID;
|
||
|
```
|
||
|
|
||
|
```text
|
||
|
+-----------+------------------------+------------------+--------------------+--------------------+
|
||
|
| studentID | FullName | programOfStudy | student-phone-cell | student-US-zipcode |
|
||
|
+-----------+------------------------+------------------+--------------------+--------------------+
|
||
|
| 1 | Monique Davis | Literature | 555-555-5551 | 97111 |
|
||
|
| 2 | Teri Gutierrez | Programming | 555-555-5552 | 97112 |
|
||
|
| 3 | Spencer Pautier | Programming | 555-555-5553 | 97113 |
|
||
|
| 4 | Louis Ramsey | Programming | 555-555-5554 | 97114 |
|
||
|
| 5 | Alvin Greene | Programming | 555-555-5555 | 97115 |
|
||
|
| 6 | Sophie Freeman | Programming | 555-555-5556 | 97116 |
|
||
|
| 7 | Edgar Frank "Ted" Codd | Computer Science | 555-555-5557 | 97117 |
|
||
|
| 8 | Donald D. Chamberlin | Computer Science | 555-555-5558 | 97118 |
|
||
|
+-----------+------------------------+------------------+--------------------+--------------------+
|
||
|
```
|
||
|
|
||
|
### Conclusão
|
||
|
|
||
|
Restrições de chave estrangeira são uma ótima ferramenta de integridade de dados. Aproveite o tempo para aprendê-las bem.
|
||
|
|
||
|
Como acontece com todas essas coisas SQL, MUITO MAIS para elas é o que está neste guia introdutório.
|
||
|
|
||
|
Espero que pelo menos isso lhe dê o suficiente para começar.
|
||
|
|
||
|
Por favor, consulte o manual do seu gerenciador de banco de dados e divirta-se tentando opções diferentes.
|