freeCodeCamp/guide/russian/sql/sql-foreign-key-constraint/index.md

101 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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 им больше, чем в этом вводном руководстве.
Надеюсь, это, по крайней мере, даст вам достаточно, чтобы начать.
Пожалуйста, ознакомьтесь с руководством для своего менеджера баз данных и получайте удовольствие от различных вариантов.