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

Problema con claves foráneas

Estas en el tema de Problema con claves foráneas en el foro de Mysql en Foros del Web. Buenas. Estoy programando una tienda online usando servlets y MySQL y me acaba de surgir un problema con las claves foráneas en la BD. Hay ...
  #1 (permalink)  
Antiguo 12/05/2011, 16:29
 
Fecha de Ingreso: marzo-2011
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 0
Problema con claves foráneas

Buenas. Estoy programando una tienda online usando servlets y MySQL y me acaba de surgir un problema con las claves foráneas en la BD.

Hay dos tipos de usuarios: clientes y administradores. Ambas tablas tienen como PK el campo DNI. Hasta ahí bien.
Por otra parte tengo la tabla 'pedido', en la que guardo información sobre el pedido y cuya PK es pedido_ID. En la tabla 'pedido' también guardo el DNI de la persona que realizo el pedido, ya fuera un cliente o un administrador. Así que, al crear la tabla pedido, puse dos claves foráneas distintas: FK_dni_admin (conectada con el campo DNI de 'admin') y FK_dni_cliente (conectada con el campo DNI de 'cliente'). Ahora, cuando intento introducir en la BD un nuevo pedido realizado por un cliente, me salta la siguiente excepción:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Cannot add or update a child row: a foreign key constraint fails (`trigo_musical`.`pedido`, CONSTRAINT `FK_dni_admin` FOREIGN KEY (`dni`) REFERENCES `administrador` (`dni`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Si por el contrario el que realiza el pedido es un administrador, me salta la casi idéntica excepción:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityCons traintViolationException: Cannot add or update a child row: a foreign key constraint fails (`trigo_musical`.`pedido`, CONSTRAINT `FK_dni_cliente` FOREIGN KEY (`dni`) REFERENCES `cliente` (`dni`) ON DELETE NO ACTION ON UPDATE NO ACTION)

Me doy cuenta de que el problema es que tengo dos claves foráneas en la misma tabla que están relacionadas con el mismo campo en dos tablas distintas. Por lo que, al intentar añadir un pedido realizado por un cliente, buscará en la tabla 'cliente' el DNI que aparezca en el pedido, pero TAMBIÉN buscará en 'administrador'. Evidentemente el DNI estará o bien en 'cliente', o bien en 'administrador', con lo cual ahí está el problema. La cuestión es que no sé qué tengo que cambiar en la base de datos para solucionar esto. Puesto que mi clave foránea en 'pedido' está relacionada tanto con 'cliente' como con 'administrador', puesto que los dos puedes realizar pedidos, ¿cómo soluciono esto?

Gracias por adelantado.
  #2 (permalink)  
Antiguo 12/05/2011, 16:47
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Problema con claves foráneas

Si tienes puestas las dos claves foráneas como NO NULAS, de ahí podría venirte el problema porque estarías obligando a ponerla siempre obligatoriamente.

Tampoco lo tengo muy claro eso porque el error que te da es que no te deja actualizar porque estás incumpliendo la integridad referencial.

Estaría bien que pusieses una imagen o un esquema de como están exactamente esas tablas y sobre todo que consultas realizas al intentar crear el pedido.
  #3 (permalink)  
Antiguo 12/05/2011, 17:18
 
Fecha de Ingreso: marzo-2011
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Problema con claves foráneas

No entiendo muy bien lo de "no nulas". Mis claves foráneas son calves primarias en las tablas referenciadas, por tanto no podrían nunca ser nulas, ¿no?

Dejo capturas del Workbench de MySQL:







La consulta que hago (desde Java) es la siguiente:

s.executeUpdate("INSERT INTO pedido "
+ "VALUES ('"
+ id + "','"
+ dni + "','"
+ cadFecha + "','"
+ cadFecha + "','"
+ forma_pago+ "',"
+ envio + ","
+ importe + ",'"
+ estado + "',"
+ online+ ");");


El campo 'dni' es un VARCHAR(9) en todas las tablas.

Saludos!
  #4 (permalink)  
Antiguo 12/05/2011, 17:29
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Problema con claves foráneas

Sí que podrían ser nulas (o por lo menos en Postgresql si pueden si dni no fuese o formase parte de la clave primaria de la tabla Pedido), pero no te afectan en este caso.

Está clarísimo el problema. Tal y como tienes configurada las claves foráneas cuando insertas un pedido te obliga a que el dni esté en ambas tablas. No hay una forma instantánea de solucionarlo, pero la más "sencilla" sería crear una tabla para los datos comunes entre usuarios y administradores y otras dos tablas (una para usuarios y otra para administradores) para los datos no comunes. De esta manera tendrías sólo una tabla con id que podrías referenciar en la tabla pedido.

Otras maneras pasarían por quitar las claves foráneas y realizar las comprobaciones con triggers, verificando al insertar si el dni insertado está en alguna de las dos tablas.

Yo apuesto por la primera solución. Si alguien se le ocurre alguna solución mejor (supongo que habrá) están bienvenidas.
  #5 (permalink)  
Antiguo 13/05/2011, 19:35
 
Fecha de Ingreso: marzo-2011
Mensajes: 20
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Problema con claves foráneas

Muchas gracias por la ayuda. Pregunté lo mismo en varios foros de habla inglesa y todo el mundo parece llegar a la misma conclusión. Me ha costado modificar la base de datos y todas las referencias en el código a las tablas, pero ya lo he conseguido y gracias a Dios funciona como la seda.

Saludos!

Etiquetas: claves
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 07:39.