Tengo dos tablas, a saber, empleados_ce y empleados_sn en la base de datos empleados.
Ambos tienen sus respectivas columnas de clave primaria únicas.
Tengo otra tabla llamada deducciones, cuya columna de clave externa quiero hacer referencia a las claves primarias de employee_ce así como de employee_sn. es posible?
por ejemplo
employees_ce
--------------
empid name
khce1 prince
employees_sn
----------------
empid name
khsn1 princess
entonces, ¿es esto posible?
deductions
--------------
id name
khce1 gold
khsn1 silver
fuente
Probablemente pueda agregar dos restricciones de clave externa (honestamente: nunca lo he probado), pero luego insistiría en que la fila principal existe en ambas tablas.
En su lugar, probablemente desee crear un supertipo para sus dos subtipos de empleados y luego apuntar la clave externa allí. (Suponiendo que tenga una buena razón para dividir los dos tipos de empleados, por supuesto).
type
en la tabla de empleados seríace
osn
.fuente
LEFT JOIN
todos, si hay pocos. Cuando no se utiliza la tabla base 'empleado', la clave principal no se puede declarar (porque hace referencia a tableA o tableB o…); ahora puede ser. Se asumió la sabiduría de dividiremployees_ce
yemployees_sn
, y se toma nota de esa suposición.De hecho, lo hago yo mismo. Tengo una tabla llamada 'Comentarios' que contiene comentarios para registros en otras 3 tablas. Ninguna solución maneja todo lo que probablemente quieras que haga. En tu caso, harías esto:
Solución 1:
Agregue un campo tinyint a employee_ce y employee_sn que tenga un valor predeterminado que sea diferente en cada tabla (este campo representa un 'identificador de tabla', por lo que los llamaremos tid_ce & tid_sn)
Cree un índice único en cada tabla utilizando el PK de la tabla y el campo de identificación de la tabla.
Agregue un campo tinyint a su tabla 'Deducciones' para almacenar la segunda mitad de la clave externa (el ID de la tabla)
Cree 2 claves externas en su tabla de 'Deducciones' (no puede hacer cumplir la integridad referencial, porque una clave será válida o la otra ... pero nunca ambas:
Solución 2: Esta solución permite mantener la integridad referencial: 1. Cree un segundo campo de clave externa en la tabla 'Deducciones', permita valores nulos en ambas claves externas y cree claves externas normales:
La integridad solo se verifica si la columna no es nula, por lo que puede mantener la integridad referencial.
fuente
Sé que este es un tema estancado durante mucho tiempo, pero en caso de que alguien busque aquí, así es como trato con las claves externas de múltiples tablas. Con esta técnica, no tiene ninguna operación en cascada impuesta por DBA, así que asegúrese de tratar con
DELETE
y tal en su código.El ejemplo de SO Op se vería así
fuente
Técnicamente posible. Probablemente haría referencia a employee_ce en las deducciones y employee_sn. Pero, ¿por qué no fusiona employee_sn y employee_ce? No veo ninguna razón por la que tengas dos mesas. Relación de nadie a muchos. Y (no en este ejemplo) muchas columnas.
Si hace dos referencias para una columna, un empleado debe tener una entrada en ambas tablas.
fuente
Sí, es posible. Deberá definir 2 FK para la 3ª mesa. Cada FK apunta a los campos obligatorios de una tabla (es decir, 1 FK por tabla extranjera).
fuente
Suponiendo que debe tener dos tablas para los dos tipos de empleados por alguna razón, extenderé la respuesta de vmarquez:
Esquema:
Datos en deducciones:
Esto le permitiría hacer que las deducciones apuntaran a cualquier otra tabla en su esquema. Este tipo de relación no es compatible con restricciones a nivel de base de datos, IIRC, por lo que deberá asegurarse de que su aplicación administre la restricción correctamente (lo que lo hace más engorroso si tiene varias aplicaciones / servicios diferentes en la misma base de datos).
fuente