Esta siempre fue una de mis dudas en mis inicios, hasta que un día encontré este interesante tutorial en MySQL Hispano, pero les juro que no entendí mucho hasta que un amigo me explico como hacerlo usando phpMyAdmin, y les aseguro que es realmente sencillo, por eso quiero transmitirles mi experiencia y mostrarles como se hace, pero de manera gráfica, para que sea de fácil entendimiento para todos. De todas formas recomiendo fuertemente el tutorial de que les hablo antes.
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:
Asumo al lector familiarizado con phpMyAdmin, así que tratare de ir los más directamente al asunto.
Nuestra Base de Datos, como ya vimos, la llamaremos padres_hijos y tendrá la siguiente estructura:
-- 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
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 (perdón esto de la fase, pero son los aires de la EURO 2008 :P)
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:
-- 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
Una vez más espero haber sido útil y recuerden que los comentarios siempre serán bien recibidos.
Para profundizar en el tema, les recomiendo las siguientes lecturas:
Saludos y Suerte.
justo lo k andaba buscando .. sigue asi me sirvio de muxoooo
chevere tu post hermano, yo estava en las mismas porque mi ingeniero nos mando un trabajo asi, pero ni el sabia como hacer, yo estaba tratando de hacer las tabals en el otro motor myisql pero no funcionaba y me daba un error que necesito privilegios pero igual estaba como root, asi es que segui tu tutorial y todo funciona bien.
Saludos
Muy bueno.
Grandioso… Este ejemplo esta super me funciono de lujo.
Se me complicó al comienzo por que quería hacerle cambios a una DB que ya estaba usando con datos cargados, (Nada importante, todavía tengo el sitio en beta xD), pero después directamente borré todo y comencé a hacerlo desde cero y es FACILISIMO!!!!! Hoy aprendí algo nuevo y tenes razón tambien es recomendable leer el manual que citas al comienzo. Muchas Gracias por compartir tu conocimientos con todos nosotros.
Gracias de verdad!!!
Un saludo de Argentina!!!
@Nod Kopfnickend gracias a ti y todos los demas por visitar mi Blog y hacerme saber que mis aportes son utiles, eso es lo que mas me reconforta xD
Gracias! Ya no tengo que acordarme de borrar registros en tablas hijas :)
buenisimo!!!, hace tiempo que quiero empezar a trabajar con mysql, pues simpre trabaje con access y con tu ejemplo pude aprender a entender el manejo. por suerte vi este blog pues ya estaba pordesistir.
Muchas gracias por acordarse de quienes somos bestias
el fondo de pantalla ta mostro puro metal yeahhh
dioss! me salvaste la vida! este aporte me sirvio de muxisimo dale segui asi
Grandioso post, en serio, basico, explicito y altamente rico en conocimiento y procesos detallados y claros, en serio MUCHAS GRACIAS. Es exactamente lo que nesecitaba, pero psss solo para enriqueser un poco descargen la version mas nueva de APPSERVER ya que yo tenia una la version5.0.4xx no es posible hacer relaciones innodb ya que su SQL no cuenta con esta opcion o como dirian tus usuarios no cuenta con este motor de almacenamiento, nuevamente MUCHAS GRACIAS, hasta luego.
Hola @Joker, que bueno que te resulta útil esta información aquí.
No se bien como es el APPSERVER, normalmente uso WAMP, creo que el problema es que debes meterte al my.ini de MySQL y allí activar las tablas InnoDB, al menos es lo que hago con MyISAM cada vez que instalo el WAMP, en este caso debe ser la operacion inversa ;-)
Excelente explicación, realmente me sirvió.
Saludos
Una pregunta,
porque las claves primarias se declaran como int(11) y no solamente int?
que quiere decir int (11)? es un entero de 11 bytes???
@elguilledigital int(11) en este caso el # 11 es la cantidad de caracteres que soportará este campo, así pasa con los campos varchar, que normalmente pueden tener hasta 255 caracteres, pero se lo puedes especificar si deseas que sean menos, asi: varchar(50)
me sirvio muchisimo!
muchas gracias
Excelente informacion, estaba atrapado y ahora podre hacer lo que necesito
gracias
EXCELENTE! ES LA ÚNICA PÁGINA QUE LO EXPLICA TAN CLARAMENTE Y DE MANERA PRACTICA! IMPRESIONANTE! MUCHISIMAS GRACIAS POR COMPARTIR CONOCIMIENTO!
excelente men!
buen aporte!
solo una duda!
si ya tengo mis campos creados y
en el sql puedo poner el codigo y
me crea la relacion o tengo que hacerlo con el indice
ALTER TABLE `hijos`
ADD CONSTRAINT `hijos_ibfk_1`
FOREIGN KEY (`hijoPadre_ID`)
REFERENCES `padres` (`padre_ID`)
ON DELETE CASCADE ON UPDATE CASCADE;