Foreign keys

Para la delcaración de claves foráneas seguiremos esta sintaxis en la parte de restricciones de tabla:

 | [CONSTRAINT [constraint_name]] 
        FOREIGN KEY (index_col_name, ...)
        REFERENCES another_table_name (index_col_name, ...)
        [ ON DELETE { RESTRICT | CASCADE | SET NULL | NO ACTION } ]
        [ ON UPDATE { RESTRICT | CASCADE | SET NULL | NO ACTION } ]

La convención será fk_{nombreTabla}_{columnas}

Acciones referenciales

Es posible programar qué va a pasar con las filas de una tabla ante un determinado evento en la fila que referencia.

ON DELETE

Define qué pasa con las filas cuando se elimina el registro al que referencian

  • RESTRICT: no permite eliminar registros de la tabla relacionada si hay registros relacionados en la tabla actual

  • CASCADE: elimina los registros relacionados al registro eliminado

  • SET NULL: Establece a NULL las columnas de la FK cuando el registro relacionado se elimina.

  • NO ACTION: Equivalente a RESTRICT

ON UPDATE

Define qué pasa con las filas cuando se actualiza el registro con el que se relacionan:

  • RESTRICT: no permite actualizar registros de la tabla relacionada si hay registros relacionados en la tabla actual

  • CASCADE: actualiza los registros relacionados al registro modificado

  • SET NULL: Establece a NULL las columnas de la FK cuando el registro relacionado se modifica.

  • NO ACTION: Equivalente a RESTRICT

Por ejemplo, si quisiéramos crear esta base de datos

Vamos a crear estas tablas con una FK que:

  • No permita eliminar personas que son dueños de algún perro

  • Si el DNI de una persona cambia, se actualiza en el perro del que son dueños.

CREATE DATABASE Perros;

USE Perros;

CREATE TABLE Persona(
    Dni VARCHAR(10) PRIMARY KEY,
    Nombre VARCHAR(30) NOT NULL,
    Apellidos VARCHAR(50) NOT NULL
);


CREATE TABLE Perro(
    Id INT AUTO_INCREMENT PRIMARY KEY,
    Nombre VARCHAR(30) NOT NULL,
    DniDueño VARCHAR(10) NOT NULL,
    CONSTRAINT fk_Perro_Dueño
    FOREIGN KEY (DniDueño)
    REFERENCES Persona(Dni)
    ON DELETE RESTRICT
    ON UPDATE CASCADE
);

Last updated