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