Este ejemplo
lo publique en mi Blog hace algún tiempo, y como veo que aqui hay quien tiene dudas con esto, se los traigo a los foreros ahora. Espero sea util.
EDITO: Como dice GatorV mas abajo, esto es solo para motores InnoDB, no funciona con MyISAM Una pequeña introducción:
Para este ejemplo usaremos la clásica Base de Datos Padres a Hijos, para así lograr al final una relación de uno (Padre) a varios (Hijos) y no complicarnos con un sistema complejo.
La Base de Datos:
Nuestra Base de Datos, como ya vimos, la llamaremos
padres_hijos y tendrá la siguiente estructura:
Código sql:
Ver original-- Base de datos: 'padres_hijos'
-- Estructura de tabla para la tabla 'padres'
CREATE TABLE 'padres' (
'padre_ID' INT(11) NOT NULL AUTO_INCREMENT,
'padreNombre' VARCHAR(25) NOT NULL,
PRIMARY KEY ('padre_ID')
) ENGINE=InnoDB ;
– Estructura de tabla para la tabla 'hijos'
CREATE TABLE 'hijos' (
'hijo_ID' INT(11) NOT NULL AUTO_INCREMENT,
'hijoNombre' VARCHAR(25) NOT NULL,
'hijoPadre_ID' INT(11) NOT NULL,
PRIMARY KEY ('hijo_ID')
) ENGINE=InnoDB ;
Como ven, lo que hemos hecho es simplemente crear un par de tablas. La tabla padres tiene un par de campos, padre_ID y padreNombre. Por su parte, la tabla hijos, tiene tres campos, hijo_ID, hijoNombre e hijoPadre_ID, este último será quien nos sirva para hacer nuestra relación
Cita: NOTA: Fíjense que el campo hijoPadre_ID es tipo INT, de lo contrario, nos enviará un error al intentar crear llaves foráneas utilizando este campo.
Creando un campo INDICE:
Una vez logrado lo anterior, ya podemos crear la relación entre ambas tablas. Para ello vamos a la estructura de la tabla hijos y creamos un
INDICE de una columna:
En el siguiente paso, escogemos el tipo de índice, que será
INDEX y el campo que utilizaremos:
hijoPadre_ID:
Damos clic sobre el botón Grabar:
Y ya tenemos nuestra tabla lista para pasar a la siguiente fase.
Logrando la Integridad Referencial:
Para lograr la Integridad Referencial, que es nuestro objetivo principal, debemos ir primeramente a la vista de relaciones, por su puesto, en la tabla
hijos:
Una vez aquí, escogemos el campo que vamos a relacionar y que previamente convertimos en un
INDICE y recuerden que tiene que ser de tipo
INT:
Elegimos las opciones
ON DELETE:
CASCADE y
ON UPDATE:
CASCADE, esto asegurará que si borramos o actualizamos algún registro de la tabla padre, todos los registros de la tabla hijos que estén relacionados con este, también se borren o actualicen, según la acción. Una vez mas, hacemos clic en Grabar y todo estará listo:
Conclusiones:
La estructura final de la Base de Datos será la siguiente:
Código sql:
Ver original-- Base de datos: 'padres_hijos'
--
-- Estructura de tabla para la tabla 'padres'
CREATE TABLE 'padres' (
'padre_ID' INT(11) NOT NULL AUTO_INCREMENT,
'padreNombre' VARCHAR(25) NOT NULL,
PRIMARY KEY ('padre_ID')
) ENGINE=InnoDB ;
– Estructura de tabla para la tabla 'hijos'
CREATE TABLE 'hijos' (
'hijo_ID' INT(11) NOT NULL AUTO_INCREMENT,
'hijoNombre' VARCHAR(25) NOT NULL,
'hijoPadre_ID' INT(11) NOT NULL,
PRIMARY KEY ('hijo_ID'),
KEY 'hijoPadre_ID' ('hijoPadre_ID')
) ENGINE=InnoDB ;
– Filtros para la tabla 'hijos'
–
ALTER TABLE 'hijos'
ADD CONSTRAINT 'hijos_ibfk_1'
FOREIGN KEY ('hijoPadre_ID')
REFERENCES 'padres' ('padre_ID')
ON DELETE CASCADE ON UPDATE CASCADE;
Como se puede ver, la tabla hijos a cambiado su estructura, ahora, además de la llave primaria (PRIMARY KEY)
hijo_ID, tenemos una llave externa o foránea (KEY)
hijoPadre_ID.
Ahora, lo más interesante de todo es la última consulta ALTER TABLE, que intentare explicar, desde mis modestos conocimientos:
ALTER TABLE 'hijos': Hacemos un cambio a la tabla hijos.
ADD CONSTRAINT 'hijos_ibfk_1': Añadimos una restricción, aquí con solo poner hijos es suficiente, pero al exportar la estructura con phpMyAdmin, automáticamente pone hijos_ibfk_1 :/
FOREIGN KEY ('hijoPadre_ID'): La llave externa será el campo hijoPadre_ID.
REFERENCES 'padres' ('padre_ID'): Que hace referencia al campo padre_ID de la tabla padres.
ON DELETE CASCADE ON UPDATE CASCADE: Cuando se borre o actualice algún registro de la tabla padre, se afectaran los registros relacionados de la tabla hijos
saludos y suerte
http://rogertm.bloggerscuba.com/post/como-crear-relaciones-y-lograr-integridad-referencial-en-tablas-innodb-usando-phpmyadmin/