La integridad referencial se puede comprometer b�sicamente en tres situaciones: cuando se est� insertando un nuevo registro, cuando se est� eliminando un registro, y cuando se est� actualizando un registro. La restricci�n de clave for�nea que hemos definido se asegura que cuando un nuevo registro sea creado en la tabla venta, �ste debe tener su correspondiente registro en la tabla cliente.
Una vez que hemos creado las tablas, vamos a insertar algunos datos que nos sirvan para demostrar algunos conceptos importantes:
mysql> INSERT INTO cliente VALUES(1,'Juan Penas'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO cliente VALUES(2,'Pepe el toro'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO venta VALUES(1,1,23); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO venta VALUES(3,2,81); Query OK, 1 row affected (0.03 sec)
En este momento no hay ning�n problema, sin embargo, vamos a ver que sucede cuando intentamos insertar un registro en la tabla venta que se refiera a un cliente no existente cuyo id_cliente es 3:
mysql> INSERT INTO venta VALUES(2,3,39); ERROR 1216: Cannot add or update a child row: a foreign key constraint fails
El hecho es que MySQL no nos permite insertar este registro, ya que el cliente cuyo id_cliente es 3 no existe. La restricci�n de clave for�nea asegura que nuestros datos mantienen su integridad. Sin embargo, �qu� sucede cuando eliminamos alg�n registro?. Vamos a agregar un nuevo cliente, y un nuevo registro en la tabla venta, posteriormente eliminaremos el registro de nuestro tercer cliente:
mysql> INSERT INTO cliente VALUES(3,'Pepe pecas'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO venta VALUES(2,3,39); Query OK, 1 row affected (0.05 sec) mysql> DELETE FROM cliente WHERE id_cliente=3; ERROR 1217: Cannot delete or update a parent row: a foreign key constraint fails
Debido a nuestra restricci�n de clave for�nea, MySQL no permite que eliminemos el registro de cliente cuyo id_cliente es 3, ya que se hace referencia a �ste en la tabla venta. De nuevo, se mantiene la integridad de nuestros datos. Sin embargo existe una forma en la cu�l podr�amos hacer que la sentencia DELETE se ejecute de cualquier manera, y la veremos brevemente, pero primero necesitamos saber como eliminar (quitar) una clave for�nea.