101 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | title: SQL Foreign Key Constraint | ||
|  | localeTitle: Restricción de clave externa de SQL | ||
|  | --- | ||
|  | ## Restricción de clave externa de SQL
 | ||
|  | 
 | ||
|  | Una clave externa es una clave utilizada para vincular dos tablas. La tabla con la restricción de clave externa (también conocida como "tabla secundaria") está conectada a otra tabla (también conocida como "tabla principal"). La conexión es entre la restricción de clave externa de la tabla secundaria y la clave principal de la tabla primaria. | ||
|  | 
 | ||
|  | Las restricciones de clave externa se utilizan para ayudar a mantener la coherencia entre las tablas. Por ejemplo, si se elimina un registro de la tabla principal y la tabla secundaria tiene registros, el sistema también podría eliminar los registros secundarios. | ||
|  | 
 | ||
|  | También ayudan a evitar el ingreso de datos inexactos en la tabla secundaria al requerir que exista un registro de la tabla principal para cada registro que se ingrese en la tabla secundaria. | ||
|  | 
 | ||
|  | ### Ejemplo de uso
 | ||
|  | 
 | ||
|  | Para esta guía, analizaremos más de cerca las tablas de estudiantes (padres) y de contacto de estudiantes (niños). | ||
|  | 
 | ||
|  | ### La clave primaria de la tabla padre
 | ||
|  | 
 | ||
|  | Tenga en cuenta que la tabla de alumnos tiene una clave principal de una columna de ID de alumno. | ||
|  | 
 | ||
|  | ```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)  | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Las claves primarias y externas de la mesa infantil.
 | ||
|  | 
 | ||
|  | La tabla de información de contacto del alumno tiene una clave principal que también es el ID de alumno. Esto se debe a que existe una relación de uno a uno entre las dos tablas. En otras palabras, esperamos solo un registro de contacto de un estudiante y un estudiante por estudiante. | ||
|  | 
 | ||
|  | ```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)  | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Ejemplo de informe utilizando la tabla de padres de alumnos y la tabla de niños de contacto
 | ||
|  | 
 | ||
|  | ```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 |  | ||
|  |  +-----------+------------------------+------------------+--------------------+--------------------+  | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Conclusión
 | ||
|  | 
 | ||
|  | Las restricciones de clave externa son una excelente herramienta de integridad de datos. Tómese el tiempo para aprenderlos bien. | ||
|  | 
 | ||
|  | Al igual que con todas estas cosas de SQL, hay MUCHO MÁS que lo que está en esta guía introductoria. | ||
|  | 
 | ||
|  | Espero que al menos esto te dé suficiente para empezar. | ||
|  | 
 | ||
|  | Consulte el manual de su administrador de base de datos y diviértase probando diferentes opciones usted mismo. |