Está en la página 1de 8

Fundación Universitaria San Mateo

Ingeniería De Telecomunicaciones

Materia:
Gestión de base de Datos

Gerson Leandro Muñoz Torres

Grupo:
01N25

2020
RESTRICCIONES

Las relaciones existentes entre distintas tablas de una base de datos MySQL que
utilizan el motor de almacenamiento InnoDB pueden estar especificadas en forma
de restricciones de clave externa (“Foreign Key Constraints”), de manera que la
propia base de datos impida que se realicen operaciones que provocarían
inconsistencias.

El comportamiento por defecto de una restricción de clave externa es impedir un


cambio en la base de datos como consecuencia de una sentencia DELETE o UPDATE,
si esta trajese como consecuencia un fallo de la integridad referencial.
Veremos primero en resumen las diferentes restricciones de integridad referencial,
haciendo uso de algunas imágenes para el caso de ON DELETE.
Las imágenes consideran dos tablas personas y ciudades relacionadas mediante la
columna ciudad_id:

1. Crear la base de datos prueba


2. Crear las tablas personas y ciudades
3. Construyo las tablas (alimentarlas con datos)
4. Sacar una copia de respaldo
5. Crear la restricción con RESTRICT
6. Usamos el comando DELETE
7. Verificar el resultado (anotar el resultado en el taller)
8. Cargar la copia de respaldo y repetir los pasos 5,6,7 con las opciones
CASCADE, SET NULL, NO ACTION

Imagen de A. Cedano para stackoverflow.es


RESTRICT
 RESTRICT: Es el comportamiento por defecto, que impide realizar modificaciones que
atentan contra la integridad referencial.
En la imagen vemos el resultado de esta consulta:

DELETE FROM ciudades WHERE ciudad_id=4;


Vemos que el registro se puede borrar porque no existe registro relacionado en la
tabla personas.

R// se deja borrar ya que esa ciudad con id 4 no tienen ningún dato relacionado.

Imagen de A. Cedano para stackoverflow.es


En cambio esta consulta:

DELETE FROM ciudades WHERE ciudad_id=1;


Arrojaría un mensaje de error:

Cannot delete or update a parent row: a foreign key constraint fails (db.personas,
CONSTRAINT personas_ibfk_1 FOREIGN KEY (ciudad_id)
REFERENCES ciudades (ciudad_id))
Porque el DELETE viola la restricción. Si la fila 1 de ciudades se borrase, las
filas 1 y 4 de personas quedarían huérfanas, o sea, sin relación en la tabla ciudades.

R// si se intenta borrar la ciudad con id 1, arroja un error ya que este id tiene
asociados dos datos de la tabla personas.

CASCADE
 CASCADE: Borra los registros de la tabla dependiente cuando se borra el registro de la
tabla principal (en una sentencia DELETE), o actualiza el valor de la clave secundaria
cuando se actualiza el valor de la clave referenciada (en una sentencia UPDATE).
En la imagen vemos el resultado de esta consulta:

DELETE FROM ciudades WHERE ciudad_id=1;


Aquí se borrarán en cascada CASCADE todos los registros de personas que
tengan ciudad_id igual a 1, y como es evidente, se borrará en ciudades la ciudad con
id 1.
R// el comando es exitoso, por lo cual se borra la ciudad con id 1, pero a su vez
borra dos datos de la tabla personas, datos que se encontraban asociados a este
id.
Imagen de A. Cedano para stackoverflow.es

SET NULL
 SET NULL: Establece a NULL el valor de la clave secundaria cuando se elimina el
registro en la tabla principal o se modifica el valor del campo referenciado.
Lo que vemos en la imagen es el resultado de esta consulta:

DELETE FROM ciudades WHERE ciudad_id=1;


Aquí la columna ciudad_id de la tabla personas establecerá los valores a NULL, en
todas las filas cuyo ciudad_id sea igual a 1. Y como es evidente, se borrará
en ciudades la ciudad con id 1.

R// Podemos observar que al ingresar este comando se borrara la ciudad con el id
1 y todos los campos que dependieran de este id quedaran marcados o se le
establece un valor de nulo.
Imagen de A. Cedano para stackoverflow.es
Por lo que ocurre en este caso es importante señalar que este CREATE TABLE:
CREATE TABLE IF NOT EXISTS personas
(
persona_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
persona_nom VARCHAR(70),
ciudad_id INT NOT NULL,
FOREIGN KEY fk_ciudad(ciudad_id) REFERENCES ciudades(ciudad_id)
ON DELETE SET NULL

)ENGINE=INNODB;
Arrojará el error:

Cannot add foreign key constraint


Creo que no es difícil averiguar el por qué :)

NO ACTION
 NO ACTION: En MySQL funciona igual que RESTRICT. Ver explicación más abajo.
R// Se ingresa el comando DELETE FROM ciudades WHERE ciudad_id=1; como se ingresa
también en restrict y arroja el mismo error ya que No Action funciona de la misma
manera que el restrict y por eso no deja eliminar la ciudad con id 1 ya que tiene datos
que dependen de él.

También podría gustarte