Foros del Web » Creando para Internet » Sistemas de gestión de contenidos »

Crear tablas relacionales con phpMyAdmin [aporte]

Estas en el tema de Crear tablas relacionales con phpMyAdmin [aporte] en el foro de Sistemas de gestión de contenidos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 17/10/2008, 08:04
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 8 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
  #2 (permalink)  
Antiguo 17/10/2008, 08:21
Avatar de Carlojas  
Fecha de Ingreso: junio-2007
Ubicación: Shikasta
Mensajes: 1.272
Antigüedad: 16 años, 10 meses
Puntos: 49
Respuesta: Crear tablas relacionales con phpMyAdmin [aporte]

Buen aporte rogertm



Saludos.
__________________
"SELECT * FROM Mujeres WHERE situacion NOT IN ('CASADAS','CON HIJOS','ATORMENTADAS','CUASI-ENNOVIADAS') AND personalidad <> 'INTENSA'"
  #3 (permalink)  
Antiguo 17/10/2008, 08:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Crear tablas relacionales con phpMyAdmin [aporte]

Buen aporte rogertm, solo recalcar que con MyISAM (engine por defecto de MySQL) no funcionan las relaciones.

Saludos.

Tema trasladado a Aplicaciones Prefabricadas.
  #4 (permalink)  
Antiguo 17/10/2008, 09:31
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 8 meses
Puntos: 638
Respuesta: Crear tablas relacionales con phpMyAdmin [aporte]

Cita:
Iniciado por GatorV Ver Mensaje
Buen aporte rogertm, solo recalcar que con MyISAM (engine por defecto de MySQL) no funcionan las relaciones.

Saludos.

Tema trasladado a Aplicaciones Prefabricadas.
Jeje, bueno es que no me alcanzaban los caracteres para el titulo del post, pero en mi Blog el titulo de esta aporte es Como crear relaciones y lograr Integridad Referencial en tablas InnoDB usando phpMyAdmin.

Ademas, en SO Windows, InnoDB es el motor por defecto, hay que cambiarlo en el my.ini (yo siempre lo hago)

saludos y suerte
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 23:09.