Foreign Key:
Una llave foránea (Foreign Key) es una limitación referencial entre dos tablas. La clave foránea identifica un campo en una tabla (tabla hija o referendo) que se refiere a un campo de otra tabla (tabla padre o referenciada).
El campo en la tabla padre debe ser clave primaria y un registro en la tabla hija no puede contener valores que no existen en la tabla padre.
Las referencias son creadas para vincular o relacionar información. Esto es una parte esencial de la normalización de base de datos.
Condiciones para vincular dos tablas con FOREIGN KEY:
Las definiciones de claves foráneas están sujetas a las siguientes condiciones:
- El FOREIGN KEY se define en el momento que se crean las tablas de la base datos, dentro de la sentencia CREATE TABLE.
- Ambas tablas deben ser InnoDB y no deben ser tablas temporales.
- La tabla padre (tabla referenciada) debe crearse primero y el campo a utilizar para la relación debe ser CLAVE PRIMARIA.
- En la tabla hija es donde se define el FOREIGN KEY y hace referencia a la tabla padre.
- El campo foráneo (de la tabla hija) y campo clave (de la tabla padre) deben ser definidos con el mismo tipo de dato.
Sentencias INSERT, UPDATE y DELETE sobre tablas relacionadas
Caso INSERT
InnoDB rechaza cualquier operación INSERT en un registro en una tabla hija cuyo valor en la clave foránea no exista en la tabla padre. Se debe insertar primero el valor en la tabla padre para luego poderlo insertar en la tabla hija.
Ejemplo: Insertar una calificación en la tabla "Calificaciones" de un alumno cuando los datos de este alumno no existen en la tabla "alumno".
Ejemplo: Insertar una calificación en la tabla "Calificaciones" de un alumno cuando los datos de este alumno no existen en la tabla "alumno".
Caso UPDATE y DELETE
La acción que InnoDB realiza para cualquier operación UPDATE o DELETE depende de lo que se haya definido en la subcláusulas ON UPDATE y ON DELETE creada en la cláusula FOREIGN KEY.
Cuando el usuario intenta borrar o actualizar un registro en una tabla padre se realizará lo siguiente:
CASCADE: Borra o actualiza el registro en la tabla padre y automáticamente borra o actualiza los registros coincidentes en la tabla hija.
NO ACTION: No se permite borrar o actualizar ningún valor de clave primaria si en la tabla hija hay un valor de clave foránea relacionada.
RESTRICT: Rechaza la operación de eliminación o actualización en la tabla padre. NO ACTION y RESTRICT son similares en tanto omiten la cláusula ON DELETE u ON UPDATE.
Sintaxis del FOREIGN KEY
FOREIGN KEY(Campo1) REFERENCES tablapadre (campo2)
ON DELETE [CASCADE NO ACTION RESTRICT]
ON UPDATE [CASCADE NO ACTION RESTRICT]
Ejemplo:
CREATE DATABASE IF NOT EXISTS nomina2;
CREATE TABLE IF NOT EXISTS departamentos(
cod_dep INT(2) NOT NULL,
descripcion VARCHAR(30) NOT NULL,
telf_dep VARCHAR(12) NOT NULL,
ciudad VARCHAR(20) NOT NULL,
presupuesto FLOAT(9,2) UNSIGNED NOT NULL,
fec_creacion DATE NOT NULL,
PRIMARY KEY(cod_dep)
) ENGINE=innidb;
CREATE TABLE IF NOT EXISTS empleado(
codigo INT(5) NOT NULL,
nombre VARCHAR(50) NOT NULL,
ingreso DATE NOT NULL,
sueldo FLOAT(7,2) UNSIGNED NOT NULL DEFAULT 7300.00,
num_hijos INT(2) UNSIGNED NOT NULL,
tipo ENUM("Fijo","Temporal") NOT NULL,
tiempo_contrato TINYINT(2) UNSIGNED DEFAULT 1 NOT NULL,
dep_asignado INT(2) NOT NULL,
PRIMARY KEY(codigo),
FOREIGN KEY(dep_asignado) REFERENCES departamentos(cod_dep)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=innodb;
Post relacionados:
Como hacer consultas en dos tablas vinculadas utilizando la clausula INNER JOIN
Ejemplo de una consulta vinculando tres tablas utilizando la clausula INNER JOIN
CREATE DATABASE IF NOT EXISTS nomina2;
CREATE TABLE IF NOT EXISTS departamentos(
cod_dep INT(2) NOT NULL,
descripcion VARCHAR(30) NOT NULL,
telf_dep VARCHAR(12) NOT NULL,
ciudad VARCHAR(20) NOT NULL,
presupuesto FLOAT(9,2) UNSIGNED NOT NULL,
fec_creacion DATE NOT NULL,
PRIMARY KEY(cod_dep)
) ENGINE=innidb;
CREATE TABLE IF NOT EXISTS empleado(
codigo INT(5) NOT NULL,
nombre VARCHAR(50) NOT NULL,
ingreso DATE NOT NULL,
sueldo FLOAT(7,2) UNSIGNED NOT NULL DEFAULT 7300.00,
num_hijos INT(2) UNSIGNED NOT NULL,
tipo ENUM("Fijo","Temporal") NOT NULL,
tiempo_contrato TINYINT(2) UNSIGNED DEFAULT 1 NOT NULL,
dep_asignado INT(2) NOT NULL,
PRIMARY KEY(codigo),
FOREIGN KEY(dep_asignado) REFERENCES departamentos(cod_dep)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=innodb;
Post relacionados:
Como hacer consultas en dos tablas vinculadas utilizando la clausula INNER JOIN
Ejemplo de una consulta vinculando tres tablas utilizando la clausula INNER JOIN
Thanks,.. Fue de utilidad para Recordar el proceso
ResponderEliminarHola una pregunta:
ResponderEliminarse puede crear un foreign key pero sin necesidad de colocar references?
no
EliminarOhh dios Gracias! lo consegui
ResponderEliminarMe ayudó mucho, mil gracias.
ResponderEliminarsi a bueno.
Eliminarla informacion es util
ResponderEliminarMuchas gracias por tus palabras. Saludos.
Eliminar