Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/10/2008, 08:04
Avatar de rogertm
rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 9 meses
Puntos: 638
Información Crear tablas relacionales con phpMyAdmin [aporte]

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
  1. -- Base de datos: 'padres_hijos'
  2. -- Estructura de tabla para la tabla 'padres'
  3. CREATE TABLE 'padres' (
  4. 'padre_ID' INT(11) NOT NULL AUTO_INCREMENT,
  5. 'padreNombre' VARCHAR(25) NOT NULL,
  6. PRIMARY KEY ('padre_ID')
  7. ) ENGINE=InnoDB ;
  8. – Estructura de tabla para la tabla 'hijos'
  9. CREATE TABLE 'hijos' (
  10. 'hijo_ID' INT(11) NOT NULL AUTO_INCREMENT,
  11. 'hijoNombre' VARCHAR(25) NOT NULL,
  12. 'hijoPadre_ID' INT(11) NOT NULL,
  13. PRIMARY KEY ('hijo_ID')
  14. ) 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
  1. -- Base de datos: 'padres_hijos'
  2. --
  3. -- Estructura de tabla para la tabla 'padres'
  4. CREATE TABLE 'padres' (
  5. 'padre_ID' INT(11) NOT NULL AUTO_INCREMENT,
  6. 'padreNombre' VARCHAR(25) NOT NULL,
  7. PRIMARY KEY ('padre_ID')
  8. ) ENGINE=InnoDB ;
  9. – Estructura de tabla para la tabla 'hijos'
  10. CREATE TABLE 'hijos' (
  11. 'hijo_ID' INT(11) NOT NULL AUTO_INCREMENT,
  12. 'hijoNombre' VARCHAR(25) NOT NULL,
  13. 'hijoPadre_ID' INT(11) NOT NULL,
  14. PRIMARY KEY ('hijo_ID'),
  15. KEY 'hijoPadre_ID' ('hijoPadre_ID')
  16. ) ENGINE=InnoDB ;
  17. – Filtros para la tabla 'hijos'
  18. ALTER TABLE 'hijos'
  19. ADD CONSTRAINT 'hijos_ibfk_1'
  20. FOREIGN KEY ('hijoPadre_ID')
  21. REFERENCES 'padres' ('padre_ID')
  22. 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/
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose

Última edición por rogertm; 30/06/2009 a las 14:00