Cuando estás trabajando en un modelo relacional, y existen dependencias entre las tablas, no puedes eliminar dichas tablas tan a la ligera, e incluso, pueden ocurrir casos en que actualizar o eliminar información no lo va a permitir la base de datos.
En SQL, sobre todo en operaciones de tipo DELETE y UPDATE, podemos especificar que acciones puede realizar el sistema gestor de bases de datos.
En MySQL hay 4 acciones que podemos hacer con los comandos DELETE y UPDATE, y son:
- CASCADE: Cuando tenemos una restricción tipo CASCADE (cascada) lo que ocurre es que elimina o actualiza los registros relacionados a la tabla relacionada, es decir, si cambiamos un valor en la tabla que hace referencia a la llave foránea de otra, ese valor automáticamente se va a ver reflejado en la otra tabla.
- SET NULL: Cuando por poner un ejm, en un blog tenemos una categoría que deseamos borrar, los registros asociados a esa categoría pasarán a la categoría NULL.
- SET DEFAULT: Si en algún momento algún valor es llave foránea se ve eliminado, el valor que van a tomar esos campos que estaban relacionados con la llave foránea van a tomar el valor por defecto que hayamos especificado en ese campo en la definición de nuestra columna.
- RESTRICT: Evita la eliminación o actualización del registro en la tabla principal, y solo nos permite eliminar en la tabla secundaria el registro hasta que en la tabla principal no haya ningún registro con ese valor.
Podemos tener una mezcla de por ejm, tener en el UPDATE CASCADE para que se actualice en cascada, y en el DELETE RESTRICT, que de hecho son las restricciones que más se suelen utilizar para poder tener una integridad correcta en los datos.
Ejercicio
Vamos a crear un ejercicio para ver el funcionamiento de las restricciones.
Ejm
CREATE TABLE lenguajes ( lenguaje_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, lenguaje VARCHAR(30) NOT NULL ); INSERT INTO lenguajes (lenguaje) VALUES ('Javascript'), ('PHP'), ('Python'), ('Ruby'), ('Java'), ('ASP'); CREATE TABLE entornos ( entorno_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, entorno VARCHAR(30) NOT NULL ); INSERT INTO entornos (entorno) VALUES ('Frontend'), ('Backend') ; CREATE TABLE frameworks ( framework_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, framework VARCHAR(50) NOT NULL, lenguaje INT UNSIGNED, entorno INT UNSIGNED, FOREIGN KEY (lenguaje) REFERENCES lenguajes(lenguaje_id) ON DELETE RESTRICT ON UPDATE CASCADE FOREIGN KEY (entorno) REFERENCES entornos(entorno_id) ON DELETE RESTRICT ON UPDATE CASCADE ); INSERT INTO frameworks (framework, lenguaje, entorno) VALUES ('React',1,1), ('Angular',1,1), ('Vue',1,1), ('Svelte',1,1), ('Laravel',2,2), ('Symfony',2,2), ('Flask',3,2), ('Django',3,2), ('On Rails',4,2),
Si yo intentara borrar un registro cuya tabla esté relacionada con otra tabla, y existan registros, en ambas, no se podrá borrar ese registro ya que ambas tablas están vinculadas. Las restricciones se definen a la hora que estamos creando nuestras tablas.
Nota: en el DELETE es aconsejable utilizar la restricción RESTRICT, mientras que en el UPDATE es conveniente aplicar la restricción CASCADE.