Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Integridad Referencial en MySQl 5

Estas en el tema de Integridad Referencial en MySQl 5 en el foro de Mysql en Foros del Web. Me gustaría poder ir cerrando este post con un ejemplo este tema de la integridad referencial. Según se indica en las FAQs, las tablas MyISAM ...
  #1 (permalink)  
Antiguo 26/02/2008, 10:33
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 20 años, 5 meses
Puntos: 1
Integridad Referencial en MySQl 5

Me gustaría poder ir cerrando este post con un ejemplo este tema de la integridad referencial.

Según se indica en las FAQs, las tablas MyISAM hasta la versión 5.0 de MySQL no soportan integridad referencia no así las tablas del tipo InnoDB. Bien.

El punto es que husmeando por ahí, ví el siguiente código:

Código PHP:
[CONSTRAINT símboloFOREIGN KEY (nombre_columna, ...)
REFERENCES nombre_tabla (nombre_columna, ...)
[
ON DELETE {CASCADE SET NULL NO ACTION
RESTRICT}]
[
ON UPDATE {CASCADE SET NULL NO ACTION
RESTRICT}] 
1) Si no lo he malinterpretado, aún teniendo tablas del tipo MyISAM puedo establecer integridad referencial tanto para la eliminación como la actualización. Correcto?
2) Cómo se entiende una integridad referencial sin FK?
3) Puede que esté muy equivocado pero si tengo dos tablas relacionadas (supongamos Empleados, Capacitacion) la columna idemple de la tabla Capacitacion no podría ser concretaemnte la FK de la tabla empleados?
4) Supongamos que insisto para un proyecto grande en basarlo en tablas MyISAM (siguiendo el ejemplo) y deseo eliminar un empleado que casualmente ha sido capacitado. Debería programar que si su id se encuentra en la tabla capacitación, "esa eliminación" NO SE PROVOQUE. Correcto?
5) Ahora (basándonos en 4), cuál sería el problema? Que debería escribir líneas y líneas de código para mantener esa integridad referencial bajo MyISAM?
6) En este u otro foro consultaba cómo debían manejarse los errores si el diseño de la base se desarrolla bajo InnoDB y si se intenta eliminar un registro con relación a otra tabla. Digo, el sistema emitiría un mensaje de error probablemente en inglés, cómo se maneja, debe ser customizado?

MGs
__________________
When all else is lost the future still remains.
  #2 (permalink)  
Antiguo 26/02/2008, 12:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Integridad Referencial en MySQl 5

1. Si manejas MyISAM, la integridad referencial se obtiene fundamentalmente mediante código (conviene recurrir a Store Procedures).
2. No existe, por definición, integridad referencial sin PK. Es parte del modelo (ver Theory & Fry).
3. Puede ser, habría que ver la definición de las tablas.
4. Exacto. Será tu responsabilidad evitar los problemas.
5. Diseñar, analizar, escribir, codificar, codificar...
6. Todos los errores de MySQL no solamente devuelven un mensaje, sino un número de error, como cualquier otro lenguaje. Esos valores son los que usamos para controlar las excepciones en las aplicaciones y en los Store Procedures.

finalmente: El código que pusiste de ejemplo, pertenece al modelo InnoDB, según el manual de referencia de MySQL.
  #3 (permalink)  
Antiguo 26/02/2008, 13:13
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 20 años, 5 meses
Puntos: 1
Re: Integridad Referencial en MySQl 5

Cita:
2. No existe, por definición, integridad referencial sin PK. Es parte del modelo (ver Theory & Fry).
NO, no dije PK sino FK (Forengein Key).

En todos los puntos estoy de acuerdo contigo pero lamentablemente no logro aún (perdón por lo duro) definir el tema es decir......... puedo o no administrar mediante código integridad referencial con tablas MyISAM?

Voy a extractar un texto de uno de los tantos manuales de MySQL versión 5: ..Si elige no utilizar integridad referencial, tenga en cuenta las siguientes consideraciones:
• Sin un chequeo por parte del servidor de integridad referencial
(intuyo que cuando se arman las tablas de entrada como InnoDB), la aplicación debe realizar este trabajo.
• Si ON DELETE es la única integridad referencial que necesita la aplicación, desde la versión 4.0 de MySQL Server puede usar comandos DELETE para borrar registros de distintas tablas con un
único comando. Consulte Sección 13.2.1, “Sintaxis de DELETE”.
• Una forma de suplir la falta de ON DELETE es añadir el comando DELETE apropiado a su aplicación cuando borre registros de una tabla que no tenga clave foránea. En la práctica, esto es tan rápido como usar una clave foránea, y más portable.


En fin, si no estoy equivocado, SI se puede aplicar integridad referencial independientemente si las tablas son MyISAM o InnoDB. La diferencia radicaría en que si son InnoDB uno se despreocupa de eliminar registros relacionados y solo le resta customizar los mensajes de error mientras que si se usan tablas MyISAM se está obligado a escribir más código y por ende, a tener mayor cuidado de no olvidar ningún control.

Estoy equivocado????
Gs.
__________________
When all else is lost the future still remains.
  #4 (permalink)  
Antiguo 26/02/2008, 14:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: Integridad Referencial en MySQl 5

Bueno. El tema es que las claves foráneas (FK, que son PK en su tabla de origen y son parte del modelo E-R), no son parte nativa de MyISAM. Eso no quiere decir que no se pueda hacer, pero el tema hay que administrarlo.
Tal vez este artículo te aclare un poco más el panorama: Enforcing Foreign Keys Programmatically in MySQL
  #5 (permalink)  
Antiguo 26/02/2008, 15:20
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Re: Integridad Referencial en MySQl 5

Hola cmarti
Cita:
puedo o no administrar mediante código integridad referencial con tablas MyISAM?
La respuesta es si.
Solo hay que ser bien cuidadosos al programar, por que si no se toma las precauciones, a la larga con tanto delete o update las datos quedan inconsistentes.

Saludos!
  #6 (permalink)  
Antiguo 26/02/2008, 21:05
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 20 años, 5 meses
Puntos: 1
Re: Integridad Referencial en MySQl 5

gnzsoloyo muy bueno el artículo que me pasaste. Es la 1:30 AM y recién se acaba de ir a dormir mi hijo y yo detrás de él. jajaja

Ya me parecía que la cosa NO ERA IMPOSIBLE pero como dice Genetix y tu también claro, no usar InnoDB implica ser muy pero muy fino con el código.

Mi insistencia con las tablas MyISAM no es por la rapidez de acceso por las que se las conoce sino simplemente por la versatilidad que estas poseen a la hora de ser transportadas.

Mañana leeré más detenidamente el enlace y el fin de semana si puedo un poco más sobre las InnoDB.

El 90% de los post que leo sobre integridad referencial apuntan directamente a las tablas InnoDB.

Gs.

Pd.: Hoy leía un artículo en mysql.com donde dicen que esperan incorporar a las tablas MyISAM la famosa integridad de la que tanto hemos hablado.
__________________
When all else is lost the future still remains.
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




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