bibigeek.com  Tu blog de Programación Geek: Java, php, J2EE... y mucho más

Hola de nuevo,
Vuelvo con otro POST de MySQL, ya os dije en el anterior POST que había investigado mucho :P … lo que me dejé en deciros es que me volví un poco loco y paranoico xD xD.

¿Cómo aplicar la Integridad Referencial con PHPMyAdmin? ¿Cómo crear las Foreign Key en PHPMyAdmin?

Estas dos preguntas podrían ser la misma, ya que para aplicar la Integridad Referencial se necesitan las Foreign Key, pero seguro que habrá gente que no conocerá la palabra Foreign Key y sí Integridad Referencial o viceversa. Vamos a utilizar el mismo ejemplo del anterior POST: el coche – modelo – servicio técnico. Veamos de nuevo el diagrama:

Modelo BD Post MySQL y las FKs

Pasos a realizar para añadir la Integridad Referencial con PHPMyAdmin

1. Crear una Base de Datos (el nombre el que queráis).

2. Crear todas las Tablas. Según el Modelo Relacional hay que crear 4 Tablas, de las cuales hay una es la que contiene las relaciones entre la T_COCHE y T_SERVICIO. Al crear una Tabla hay que especificar que el Motor de almacenamiento sea el InnoDB y no el que viene por defecto, el MyISAM. Como en el modelo no he especificado los campos/entidades tendremos que mirar todo el manual, lo siento.

- Creamos la Tabla T_COCHE:

Tabla T_COCHE

Contiene tres campos: MARCA la especificamos como la Primary Key, NOMBRE y DESCRIPCION. Como podréis fijaros lo que SÍ es importante es que el combo de longitud / Valores tiene una cantidad u otra, eso va según lo que vayamos necesitando. Otra cosa a tener en cuenta es el COTEJAMIENTO, hemos puesto el utf8-general-ci (dedicaré un POST para explicar la diferencia entre el cotejamiento utf8-unicode-ci y el utf8-general-ci, lo estuve buscando y me gustó como Tema para un POST, así no se me olvidan los conocimientos). Veamos el resumen después de dar de alta la Tabla:

Tabla T_COCHE

Esta última imagen se muestra el resumen, tanto del código SQL como la especificación de las entidades, los botones pertinentes para hacer las modificaciones, eliminar la entidad… También nos especifica cual es la Primary Key.

- Creamos la Tabla T_MODELO:

Tabla T_MODELO parte 1
Tabla T_MODELO PART2

Hay dos imágenes porque en una no me cabía el pantallazo :P . Aquí podéis fijaros que he creado un autonumérico (IDMODELO) que será la Primary Key. Le he especificado que no pueden ser números negativos (ocupa menos B) y como en el resto de campos, el cotejamiento es utf8-general-ci. Fijarse que nuevamente para la creación de la tabla especificamos que el Motor de Almacenamiento sea InndoDB. Igual que en la anterior Tabla, mostramos el resumen de su creación:


Tabla T_MODELO

- Creamos la Tabla T_SERVICIOTECNICO:

Aunque el nombre no corresponda con el del diagrama especificado (T_SERVICIO), es lo mismo y no ha cambiado para nada su función u objetivo, sólo se ha cambiado porque quedaba mucho más claro que el nombre anterior.

En esta tabla no hay mucho que explicar ya que es lo mismo que en las anteriores Tablas (después de esto ya vendrán las relaciones Foreign Key). Solamente pondré las imágenes para que quede totalmente claro cuales son los campos, los tipos, longitud/Valores, etc. Imágenes de su creación:

Tabla T_SERVICIOTECNICO Parte1
Tabla T_SERVICIOTECNICO

Ahora vendrá la imagen del resumen de la creación de la Tabla:

Tabla T_SERVICIOTECNICO

- Creamos la Tabla T_COCHE_SERVTEC:

Sólo voy a añadir una imagen, ya que estos dos campos tienen que tener la MISMA especificación que los ID’s que tienen las tablas: T_COCHE y T_SERVICIOTECNICO.

¿Por qué la misma especificación? Porqué esta tabla va a ser la que contenga la relación N – N del Modelo Entidad Relación (MER) que hemos explicado en el diagrama y van a ser los mismos valores. Si no lo ponemos idénticamente, a la hora de hacer la relación, el MySQL nos lanzará una excepción de Error. Veamos la imagen con la especificación:

Tabla T_COCHE_SERVTEC
3. Crear los INDEX.

Hay que crear obligatoriamente los INDEX para establecer las Foreign Keys, ¿pero a qué campo hay que aseginarle la propiedad Index? Pues le asignaremos la propiedad INDEX a los campos que serán las FOREIGN KEY de la Tabla.

- Creamos el Index de la Tabla T_MODELO:

Cuando he creado la Tabla T_MODELO he dejado un campo sin CREAR (aposta), que es la FOREIGN KEY de la Tabla T_COCHE (esto responde a la relacion 1-N entre T_COCHE – T_MODELO). Por lo tanto, ahora voy a poner dos imágenes de cómo creo el nuevo Campo. Va a tener la misma especificación que la Primary Key de la Tabla T_COCHE (MARCA) y le añadiré la propiedad de INDEX:

Tabla T_MODELO Crear INDEX

Veamos ahora la imagen que muestra el resumen de la creación del nuevo Campo. He resaltado dos cosillas: una nueva función que podemos realizar con la Tabla “Vista de relaciones”, y segundo, emmarco el INDEX que le he llamado igual que la Primary Key, MARCA.

Tabla T_MODELO creado INDEX

- Creamos los INDEX de la Tabla T_COCHE_SERVTEC:

En esta tabla las Primary Keys, que son IDMODELO e IDSERVICIO, también van a ser los INDEX , ya que son las Foreign Keys de sus respectivas Tablas. NO importa hacer una MODIFICACIÓN de los campos creados, sólo tendremos que pulsar el botón de INDEX de la Sección “ACCIÓN” de PHPMyAdmin, automáticamente ya hace el ALTER TABLE. Mirad la siguiente imagen, lo describe mucho mejor:

Tabla T_COCHE_SERVTEC crear INDEXs

4. Creamos las Relaciones (Foreign Keys, FKs) con PHPMyAdmin.

Cuando creamos un Tabla con el Motor INNODB y los INDEX correspondientes, si seleccionamos para ver la estructura de la Tabla, automáticamente se añade una nueva función en la Tabla: “Vista de Relaciones” (lo hemos visto hace dos imágenes). Por lo tanto, ahora veremos en las siguientes imágenes como crear las Foreign Key de forma gráfica con el PHPMyAdmin.

- Creamos la Foreign Key de la Tabla T_MODELO:

Primero entramos en la estructura de la Tabla.
Después pulsamos el botón de la función: “Vista de relaciones”. Ver imagen:
VISTA_RELACIONES_PHPMYADMIN_T_MODELO

Una Vez pulsado el botón accederemos una nueva página de PHPMyAdmin la cual nos indica cuales de los campos pueden ser Foreign Key. En este caso, el campo MARCA es nuestra Foreign Key, y la tenemos que relacionar con la Tabla T_COCHE. Veamos la imagen de como lo está mostrando el PHPMyAdmin:

FKS DISPONIBLES de la Tabla T_MODELO

Para relacionar la Tabla T_COCHE deberemos seleccionar la opcion T_COCHE -> MARCA. Veamos la imagen del Resumen:

FK T_MODELO anyadido

Cómo podéis daros cuenta no es un procedimiento trivial, lleva su trabajillo y sus cosas, que si especificar el INNODB, crear los INDEX, ahora ya se pueden hacer las relaciones… no es fácil, pero cuando se hacen dos o tres la mecánica ya se lleva dentro.

- Creamos las Relaciones de T_COCHE_SERVTEC:

Al ser el mismo procedimieto que el anterior, directamente os muestro el RESUMEN de como tendría que quedar la Tabla, veamos:

FK_T_COCHE_SERVTEC RESUMEN

Hasta aquí el segundo POST, que algunos ya me escribieron comentarios en que lo esperaban.
Daros las gracias a tod@s por vuestras ayuda, si hay algo que esté mal o que creáis que está mal expresado o que no se entiende, por favor, no dudéis en contactar conmigo y lo cambiamos.
Muchas gracias a todos!!!! bibigeek!!!!

8 Comentarios

  1. Claves foráneas (foreign keys) con MySQL | aNieto2K on Agosto 31, 2009 10:15 pm

    [...] tutorial de como conseguir claves foraneas (foreign keys) con MySQL. Edito: Xisco añade un nuevo tutorial con el que conseguir foreign keys desde PHPMyAdmin. ← Creando un querySelector() para IE tan rápido como el [...]

  2. Maximo on Septiembre 1, 2009 2:33 am

    GRACIAS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  3. arleyb on Septiembre 1, 2009 6:52 pm

    Si tienen algun problema en habilitar el motor InnoDB con XAMPP instaldo como servidor web local, pueden mirar este post en el que planteo una solución que me dio resultado http://www.forosdelweb.com/f86/problema-con-foreign-key-463909/

  4. bibigeek on Septiembre 1, 2009 7:06 pm

    Como muy bien ha puesto arleyb puede ser que tengamos problemas con nuestro MySQL, puede ser que no esté activado el Motor InnoDB. Ahora actualizaré el POST para especificarlo más detalladamente, pero os dejo una posible solución en Sistemas UNIX:

    
    user@machine: cd /etc/mysql
    user@machine: vim my.cnf
    

    Este un trozo del fichero, hay que comentar la línea skip innodb, con # y reiniciar el MySQL
    #bdb_max_lock = 10000

    # the following is the InnoDB configuration
    # if you wish to disable innodb instead
    # uncomment just the next line
    skip-innodb
    #
    # the rest of the innodb config follows:
    # don’t eat too much memory, we’re trying to be safe on 64Mb boxes

  5. andrea on Octubre 6, 2009 3:26 am

    Que buen POST… Gracias, voy a practicarlo y les estare contando..

    Chaos

  6. Chinito on Octubre 29, 2009 10:55 am

    muchisimas gracias!!!

  7. gosunkugi on Noviembre 28, 2009 12:10 am

    oooh! maravilloso! :D muchísimas gracias!!

  8. Jonathan on Enero 21, 2010 6:58 pm

    uff, post buenísimo! que vengan más!

Escribe un Comentario