Integridad referencial en MySQL

Una de las principales bondades de las claves for�neas es que permiten eliminar y actualizar registros en cascada.

Con las restriccciones de clave for�nea podemos eliminar un registro de la tabla cliente y a la vez eliminar un registro de la tabla venta usando s�lo una sentencia DELETE. Esto es llamado eliminaci�n en cascada, en donde todos los registros relacionados son eliminados de acuerdo a las relaciones de clave for�nea. Una alternativa es no eliminar los registros relacionados, y poner el valor de la clave for�nea a NULL (asumiendo que el campo puede tener un valor nulo). En nuestro caso, no podemos poner el valor de nuestra clave for�nea id_cliente en la tabla venta, ya que se ha definido como NOT NULL. Las opciones est�ndar cuando se elimina una registro con clave for�nea son:

  • ON DELETE RESTRICT
  • ON DELETE NO ACTION
  • ON DELETE SET DEFAULT
  • ON DELETE CASCADE
  • ON DELETE SET NULL

ON DELETE RESTRICT es la acci�n predeterminada, y no permite una eliminaci�n si existe un registro asociado, como se mostr� en el ejemplo anterior. ON DELETE NO ACTION hace lo mismo.

ON DELETE SET DEFAULT actualmente no funciona en MySQL - se supone que pone el valor de la clave for�nea al valor por omisi�n (DEFAULT) que se defini� al momento de crear la tabla.

Si se especifica ON DELETE CASCADE, y una fila en la tabla padre es eliminada, entonces se eliminar�n las filas de la tabla hijo cuya clave for�nea sea igual al valor de la clave referenciada en la tabla padre. Esta acci�n siempre ha estado disponible en MySQL.

Si se especifica ON DELETE SET NULL, las filas en la tabla hijo son actualizadas autom�ticamente poniendo en las columnas de la clave for�nea el valor NULL. Si se especifica una acci�n SET NULL, debemos asegurarnos de no declarar las columnas en la tabla como NOT NULL.

A continuaci�n se muestra un ejemplo de eliminaci�n en cascada:

mysql> ALTER TABLE venta ADD FOREIGN KEY(id_cliente)
    -> REFERENCES cliente(id_cliente) ON DELETE CASCADE;
Query OK, 3 rows affected (0.23 sec)
Records: 3  Duplicates: 0  Warnings: 0

Vamos a ver como est�n nuestros registros antes de ejecutar la sentencia DELETE:

mysql> SELECT * FROM cliente;
+------------+--------------+
| id_cliente | nombre       |
+------------+--------------+
|          1 | Juan Penas   |
|          2 | Pepe el toro |
|          3 | Pepe pecas   |
+------------+--------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM venta;
+------------+------------+----------+
| id_factura | id_cliente | cantidad |
+------------+------------+----------+
|          1 |          1 |       23 |
|          2 |          3 |       39 |
|          3 |          2 |       81 |
+------------+------------+----------+
3 rows in set (0.00 sec)

Ahora eliminaremos a Pepe Pecas de la base de datos:

mysql> DELETE FROM cliente WHERE id_cliente=3;
Query OK, 1 row affected (0.05 sec)

mysql> SELECT * FROM venta;
+------------+------------+----------+
| id_factura | id_cliente | cantidad |
+------------+------------+----------+
|          1 |          1 |       23 |
|          3 |          2 |       81 |
+------------+------------+----------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM cliente;
+------------+--------------+
| id_cliente | nombre       |
+------------+--------------+
|          1 | Juan Penas   |
|          2 | Pepe el toro |
+------------+--------------+
2 rows in set (0.00 sec)

Con la eliminaci�n en cascada, se ha eliminado el registro de la tabla venta al que estaba relacionado Pepe Pecas.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR