101 lines
6.4 KiB
Markdown
101 lines
6.4 KiB
Markdown
|
---
|
|||
|
title: SQL Foreign Key Constraint
|
|||
|
localeTitle: Ограничение внешнего ключа SQL
|
|||
|
---
|
|||
|
## Ограничение внешнего ключа SQL
|
|||
|
|
|||
|
Внешний ключ - это ключ, используемый для связывания двух таблиц. Таблица с Ограничением внешнего ключа (так называемая «дочерняя таблица») связана с другой таблицей (иначе говоря, «родительская таблица»). Соединение между внешним ключом дочерней таблицы и основным ключом родительской таблицы.
|
|||
|
|
|||
|
Внешние ограничения ключей используются для поддержания согласованности между таблицами. Например, если запись родительской таблицы удалена и дочерняя таблица имеет записи, система также может удалить дочерние записи.
|
|||
|
|
|||
|
Они также помогают предотвратить ввод неточных данных в дочернюю таблицу, требуя, чтобы запись родительской таблицы существовала для каждой записи, введенной в дочернюю таблицу.
|
|||
|
|
|||
|
### Пример использования
|
|||
|
|
|||
|
В этом руководстве мы более подробно рассмотрим таблицы учеников (родителей) и учеников (детей).
|
|||
|
|
|||
|
### Основной ключ родительской таблицы
|
|||
|
|
|||
|
Обратите внимание, что таблица учеников имеет первичный ключ одного столбца 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)
|
|||
|
```
|
|||
|
|
|||
|
### Основной и внешний ключи дочернего стола
|
|||
|
|
|||
|
В таблице контактных данных учащегося есть один первичный ключ, который также является идентификатором studentID. Это связано с тем, что между двумя таблицами существует взаимно однозначная взаимосвязь. Другими словами, мы ожидаем только одного студента и одного студенческого контакта на одного студента.
|
|||
|
|
|||
|
```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)
|
|||
|
```
|
|||
|
|
|||
|
### Пример отчета с использованием родительской таблицы ученика и контактной дочерней таблицы
|
|||
|
|
|||
|
```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 |
|
|||
|
+-----------+------------------------+------------------+--------------------+--------------------+
|
|||
|
```
|
|||
|
|
|||
|
### Вывод
|
|||
|
|
|||
|
Внешние ограничения ключей - отличный инструмент для обеспечения целостности данных. Потратьте время, чтобы изучить их хорошо.
|
|||
|
|
|||
|
Как и для всех этих SQL-вещей, MUCH MORE им больше, чем в этом вводном руководстве.
|
|||
|
|
|||
|
Надеюсь, это, по крайней мере, даст вам достаточно, чтобы начать.
|
|||
|
|
|||
|
Пожалуйста, ознакомьтесь с руководством для своего менеджера баз данных и получайте удовольствие от различных вариантов.
|