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