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.