Está en la página 1de 20

Definir

restricciones a
la(s) llave(s)
foránea(s).
MTI José Hernández Rodríguez
Diagrama E-R para explicar el funcionamiento de las restricciones
en las Foreign Key.

IdAutor IdLibro
1:N

Autor R Libro

titulolib IdAutorLib
nombreaut

MTI José Hernández Rodríguez


Si no definimos restricciones para
las FK, MySQL lo hará por nosotros
Por default las restricciones que agrega a una FK son:
ON DELETE NO ACTION
ON UPDATE NO ACTION

MTI José Hernández Rodríguez


En esta tabla HIJO(libro) no he definido restricción a mi llave foránea, sin embargo
MySQL, lo ha hecho por mi, por default ha agregado ON DELETE NO ACTION ON
UPDATE CASCADE

MTI José Hernández Rodríguez


En esta versión de MySQL no me visualiza la restricción por default, aquí debería aparecer
ON DELETE NO ACTION ON UPDATE CASCADE

MTI José Hernández Rodríguez


¿Cómo me doy cuenta?
Insertamos a la tabla autor 2 autores, noten que
use null porque es auto_increment

Inserto ahora un libro a mi tabla libro, pero al final le pongo 2, en este caso si me deja agregarlo, por
que el 2 representa la llave primaria en la tabla padre, de no existir mandaría un error

MTI José Hernández Rodríguez


Quiero insertar a la tabla
libros, otro libro, sin
embargo noten que use el
campo foráneo 3, y ese no
existe por eso me manda el
error, solo tengo 1 y 2

MTI José Hernández Rodríguez


Si elimino un autor (idautor 2), me manda error, ¿ por qué?

La respuesta es porque, por


default MySQL agrega la
restricción ON DELETE NO
ACTION, que significa, que El autor 2
si quiero eliminar un padre,
y tiene hijos no lo podré es padre
hacer del libro 1

MTI José Hernández Rodríguez


¿NOTARON ALGO? Sucede lo mismo si quiero cambiar el id de un autor, por
ejemplo de 2 lo quiero cambiar a 20

Las restricciones fueron definidas en la tabla hija, pero


surten efecto cuando trabajamos con las tablas padres
en los ejemplos, intentamos eliminar y actualizar la PK
en la tabla padre

MTI José Hernández Rodríguez


¿Y si quiero definir restricciones para
las FK, y que MySQL no lo haga por
mi? Podré definir las restricciones a una FK combinándolas así:

ON DELETE NO ACTION ON DELETE CASCADE


ON UPDATE CASCADE ON UPDATE CASCADE
ON DELETE CASCADE
ON UPDATE NO ACTION

MTI José Hernández Rodríguez


Veamos esta combinación:
Elimina en cascada, es decir si elimino
un padre y este tiene hijos, se elimina
el padre y todos sus hijos
ON DELETE CASCADE
Actualiza en cascada, si actualizo la PK
ON UPDATE CASCADE de un padre y este tiene hijos, se
actualiza el id del padre y en todos
sus hijos también cambia

MTI José Hernández Rodríguez


Elimino la tabla libro y la vuelvo a construir,
pero agrego la restricción on delete cascade
on update cascade, despues de el nombre
de la tabla padre y de la PK

Vuelvo a insertar el libro con el autor 2

MTI José Hernández Rodríguez


Ahora hago la misma
operación de
actualizar el id 2 por
20 y si lo permite

Hago select a autor y


cambió a 20

Hago select a libro y


también cambio

Y esto sucede porque agregué ON UPDATE CASCADE

MTI José Hernández Rodríguez


Y si elimino el id 20 de la tabla
autor

Hago select a la tabla autor y el


id 20 ya no está

Pero si hago select a la tabla


libros no hay nada ya que solo
teníamos un libro y era del autor
20, también lo elimina

Y es porque puse

ON DELETE CASCADE

MTI José Hernández Rodríguez


FORMA 2
También pude haber solo eliminado
la FK de la tabla libro y volverla a
agregarla pero con las restricciones:
ON DELETE CASCADE
ON UPDATE CASCADE

MTI José Hernández Rodríguez


Para poder eliminar
una FK debo saber
que identificador
tiene si yo lo puse lo
sabré, sino MySQL
lo hará por
nosotros.

Y sino lo recuerdo
pues hago show
table nombre de la
tabla

MTI José Hernández Rodríguez


Ahora si elimino. Poniendo el identificador que tiene asignado

Verificamos y ya no existe la llave foránea

MTI José Hernández Rodríguez


Agrego la llave foránea y al mismo tiempo le pongo las restricciones

Si hago un show create table libro veré el identificador y la nueva restricción

MTI José Hernández Rodríguez


¿Qué restricción para la FK debo
usar?
Se acostumbra a tratar de no eliminar ningún padre incluido sus hijos, ya que
esto aportan información histórica, y en un futuro poder usarla.

También se acostumbra a que las PK no deber ser modificadas, pero en caso


de ser necesario recomiendo la siguiente combinación

ON DELETE NO ACTION
ON UPDATE CASCADE

MTI José Hernández Rodríguez


¿y que pasa sino defino FK en mi
base de datos?
Simplemente que no será una base de datos del tipo RELACIONAL.
- Cuando inserte una nueva fila hija y no esté su fila padre, esta será una fila hija sin
padre.
- Y si elimino una fila padre y este tiene filas hijos, todas las filas hijos se quedarán sin
padre.
- También si actualizo el valor de una PK, las filas hijas que tenia asociadas, tendrán
un padre que no existe en la tabla padre.
- Y sucederá lo mismo si actualizo una FK por un valor no existente en la tabla padre,
esa fila hija, tendrá un padre inexistente.

MTI José Hernández Rodríguez

También podría gustarte