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

FK duda

Estas en el tema de FK duda en el foro de Mysql en Foros del Web. Veamos, tengo la siguiente duda a la hora de actualizar una tabla en MYSQL, la tabla es la siguiente: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original ...
  #1 (permalink)  
Antiguo 24/05/2013, 04:45
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 3 meses
Puntos: 22
FK duda

Veamos, tengo la siguiente duda a la hora de actualizar una tabla en MYSQL, la tabla es la siguiente:

Código MySQL:
Ver original
  1. CREATE TABLE `articulos` (
  2.   `idArticulo` int(11) NOT NULL AUTO_INCREMENT,
  3.   `idAutor` int(11) NOT NULL,
  4.   `idEditor` int(11) DEFAULT '0',
  5.   `tituloArticulo` varchar(50) DEFAULT NULL,
  6.   `resumenArticulo` varchar(500) DEFAULT NULL,
  7.   `coautoresArticulo` varchar(500) DEFAULT NULL,
  8.   `imagenArticulo` varchar(50) DEFAULT NULL,
  9.   `pdfArticulo` varchar(200) DEFAULT NULL,
  10.   `estadoArticulo` int(11) DEFAULT '1',
  11.   `idVolumen` int(11) DEFAULT NULL,
  12.   PRIMARY KEY (`idArticulo`),
  13.   KEY `articulos_ibfk_2` (`estadoArticulo`),
  14.   KEY `articulos_ibfk_3` (`idVolumen`),
  15.   KEY `articulos_ibfk_1` (`idAutor`),
  16.   CONSTRAINT `articulos_ibfk_1` FOREIGN KEY (`idAutor`) REFERENCES `usuarios` (`idUsuario`) ON DELETE CASCADE,
  17.   CONSTRAINT `articulos_ibfk_2` FOREIGN KEY (`estadoArticulo`) REFERENCES `estados` (`idEstado`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  18.   CONSTRAINT `articulos_ibfk_3` FOREIGN KEY (`idVolumen`) REFERENCES `volumenes` (`idVolumen`) ON DELETE NO ACTION ON UPDATE NO ACTION

El problema esta en el campo idVolumen, si intento insertar un nuevo articulo el idVolumen nose lo indico y me inserta perfectamente.

Pero si despues quiero actualizar, lo tengo hecho de la siguiente manera:
Cita:
Editado: Código de programación no permitido en foros de BBDD.
Esto me lanza un error de tipo:
Cita:
Estado HTTP 500 - Request processing failed; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Cannot add or update a child row: a foreign key constraint fails (`todomotor`.`articulos`, CONSTRAINT `articulos_ibfk_3` FOREIGN KEY (`idVolumen`) REFERENCES `volumenes` (`idVolumen`) ON DELETE NO ACTION ON UPDATE NO ACTION)
Porque la variable "INT idVolumen" contiene un 0 y al intentar insertar un 0 no existe dicho volumen en la tabla asociada....

Cual es la solucion correcta??
Implementar dos metodos para actualizar uno actualizando el volumen y otro no??

Un ayuda por favor :( me lio mucho con estas cosas!!!

Última edición por gnzsoloyo; 24/05/2013 a las 06:23 Razón: Código de programación no permitido en foros de BBDD.
  #2 (permalink)  
Antiguo 24/05/2013, 06:26
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, 4 meses
Puntos: 2658
Respuesta: FK duda

La restricción de FK, cuando es mandatoria como en tu caso, implica que siempre la tabla referida debe contener el valor correspondiente, y la el campo referenciado no puede ser nulo o contener valores que no existan en su tabla referida.
En otras palabras: Debes insertar primero el volumen, recuperar la PK, y recién entonces puedes hacer el segundo insert.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/05/2013, 07:00
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 3 meses
Puntos: 22
Respuesta: FK duda

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La restricción de FK, cuando es mandatoria como en tu caso, implica que siempre la tabla referida debe contener el valor correspondiente, y la el campo referenciado no puede ser nulo o contener valores que no existan en su tabla referida.
En otras palabras: Debes insertar primero el volumen, recuperar la PK, y recién entonces puedes hacer el segundo insert.
Para que nos entendamos, con volumen me refiero a un volumen de una revista, por lo tanto un volumen es un conjunto de articulos
Cuando creo un volumen selecciono los articulos que quiero para insertarlos en el.

Pero es que un articulo puede no pertenecer a ningun volumen. Y cuando creas el articulo o lo modificas necesitas que el campo idVolumen se mantenga nulo porque no tiene volumen.

Vamos que no me vale crear primero el Volumen, porque necesito que existan los articulos para poder crearlo.

Como deberia plantearlo?
  #4 (permalink)  
Antiguo 24/05/2013, 07:38
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, 4 meses
Puntos: 2658
Respuesta: FK duda

Entonces, Volumen no es atributo en Artículo, esta es una entidad base que puede o no estar relacionada con Volumen.
En ese modelo, debe existir una entidad articulo_volumen, donde se relacionen ambas, ya que incluso un Artículo puede estar relacionado con más de un volumen, si el mismo se ha publicado en una o más revistas (algo posible en la realidad, aunque no se en tu sistema).
Como sea, el modelo de datos no está bien planteado. Tienes que revisarlo otra vez.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/05/2013, 07:50
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 3 meses
Puntos: 22
Respuesta: FK duda

No entiendo entonces como lo tengo que hacer...

En mi sistema un articulo solo puede pertenecer a un volumen.

Yo tengo la tabla Volumenes y la tabla Articulos.

Un articulo puede pertenecer a 0 o 1 Volumen
Un volumen puede tener 1 o N articulos, por eso puse la FK idVolumen en la tabla articulos.

Pero me aparece el problema que te comente antes...

¿Como lo harias tu? Tengo un lio..., ya nose si lo tengo bien o lo tengo mal jajaj
  #6 (permalink)  
Antiguo 24/05/2013, 08:08
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, 4 meses
Puntos: 2658
Respuesta: FK duda

Es una relación N:N, requiere una tabla.
Lo que no estás viendo es que, aunque no lo plantees en tu diseño de datos, hay una entidad base: Revista.
Si la incorporas al sistema, se ve la dependencia:
Revista <- Volumen <- articulos_volumen -> Articulo

Es decir:
- Una revista tiene N volúmenes.
- Cada volumen tiene 1 a N Artículos.
- Un Artículo puede o no ser publicado en un volumen.

En ese contexto, no hay relación mandatoria entre ambos. para poder crear una relación opcional se debe crear una tabla.

Esencialmente es lo mismo que una factura: Cada factura es única, con si fecha de emisión, datos de cliente, etc. Pero el detalle de la factura no es parte de la tabla, es otra tabla que relaciona los productos con la factura.
Imagina que cambias los nombres, Factura por Volumen, Producto por Artículo y Detalle_Factura por Volumen_Articulo...

La lógica sigue siendo la misma...

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/05/2013, 08:26
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 3 meses
Puntos: 22
Respuesta: FK duda

Se entiende!!! y se agradece tu ayuda :)
  #8 (permalink)  
Antiguo 24/05/2013, 08:48
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, 4 meses
Puntos: 2658
Respuesta: FK duda



__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campo, insert, sql, tabla
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 19:26.