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:
Creando un campo INDICE: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.
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/