mysql - optimizar - no se puede agregar o actualizar una fila secundaria falla una restricción de clave externa
¿Clave extranjera para una de muchas tablas? (4)
La forma habitual de establecer una restricción de clave externa es elegir a qué tabla apuntará la clave externa.
Estoy teniendo una relación polimórfica entre 1 tabla y un conjunto de tabla.
Eso significa que esta tabla tendrá una relación con una de esas tablas en el conjunto.
p.ej.
images: person_id, person_type
subordinates: id, col1, col2...col9
products: id, colA, colB...colZ
En el ejemplo anterior, si person_type es "subordinados", person_id debe ser una clave foránea para subordinates.id y lo mismo ocurre con los productos.
Entonces me pregunto, ¿es posible tener una clave externa para una de muchas tablas, o tienes que establecer específicamente a qué tabla apunta cuando asignas una?
Esta pregunta es para MySQL y PostgreSQL.
Gracias
Por definición, una clave externa debe apuntar a una clave primaria o candidata en la tabla uno-y-uno-primario-solo está disponible en un DBMS típico. Es mejor tener una sola tabla de "personas" y tener tablas relacionadas con esto, por ejemplo, con la información del gerente.
Una clave externa solo puede apuntar a una sola tabla.
Me parece que lo que realmente quería hacer aquí es crear una identificación para padres en su mesa de personas. Los subordinados tendrían una identificación de padres apuntando a sus gerentes. Si un subordinado necesita tener varios administradores, se puede crear una tabla de unión separada con 2 columnas, cada una de las cuales contiene una identificación de persona, una es el subordinado y la otra es uno de los administradores.
Si desea restringir quién podría asignarse al campo parentid, esto podría hacerse con una restricción de verificación.
Una columna es solo un marcador de posición para un valor. Una restricción de clave externa significa que los datos almacenados dentro de esa columna solo pueden ser un valor que coincida con la columna de la tabla definida en la restricción. Las restricciones de clave externa son por tabla ...
No hay nada que le impida definir múltiples restricciones de clave externa en una columna. Pero esto significa que el único valor que se permite almacenar serán los valores que ya existen en todas las demás tablas relacionadas con el exterior. IE: TABLE_1 tiene los valores 1 y 2, TABLE_2 tiene los valores 2 y 3 - TABLE_3 tiene relaciones de clave foránea definidas para las tablas 1 y 2 en la columna col
de TABLE_3 ... El único valor válido que puedo insertar en TABLE_3.col
es 2, porque es en ambas tablas (suponiendo que col
no es nulable).
No, una restricción de clave externa siempre hace referencia exactamente a una tabla padre.
Esta pregunta aparece con frecuencia. Estas son algunas de mis respuestas anteriores:
- ¿Por qué no puedes tener una clave externa en una asociación polimórfica?
- Posible hacer una clave externa de MySQL a una de dos tablas posibles?
- Hacer referencia a claves foráneas en la misma columna
- En un clon de , ¿qué relación debería tener una tabla de Comentarios con las Preguntas y respuestas?
- MySQL - Restricciones de clave foránea condicional
- ¿Cómo manejar una relación "O" en un diseño ERD (tabla)?
- MySQL: dos relaciones n: 1, pero no ambas a la vez
Para obtener más información sobre asociaciones polimórficas, vea mi presentación Modelos prácticos orientados a objetos en SQL o mi libro, SQL Antipatterns: Cómo evitar las trampas de la programación de bases de datos .