¿Una vista necesita sus propias restricciones de clave externa?

10

Descargo de responsabilidad: soy un programador, no un DBA, así que tengan paciencia conmigo ...

Tengo una vista que utilizo para mapear 2 entidades juntas. Tengo que hacer una unión entre algunas tablas diferentes para obtener eso:

CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS (
SELECT SG.SCREENING_GROUP_ID, V.SITE_ID
FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD
WHERE VD.VISIT_ID = V.VISIT_ID 
AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID);

Lo anterior es solo por contexto, no te preocupes demasiado por eso. Lo que necesito saber es cómo hacer que los campos en mi nueva vista V_SCREENING_GROUP_SITES (SCREENING_GROUP_ID y SITE_ID) se comporten como claves foráneas para las tablas SCREENING_GROUP y SITE. ó acaso importa?

Si fuera una mesa, haría:

ALTER TABLE V_SCREENING_GROUP_SITES
ADD CONSTRAINT FK_SCREENING_GROUP_ID
FOREIGN KEY (SCREENING_GROUP_ID)
REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID;
...

Pero dado que es una vista que obviamente no funciona. No pude encontrar una sintaxis ALTER VIEW que funcione para configurar FK. ¿Qué tengo que hacer?

(Esta es una base de datos MySQL)

Troya
fuente

Respuestas:

12

Una vista es una tabla lógica que se basa en una o más tablas físicas. Si hay relaciones de claves externas en las tablas subyacentes, se manifestarán en la vista. Las vistas dependen completamente de las tablas de las que derivan, por lo que no es posible agregarles claves externas.

gview
fuente
1
Genial, así que no necesito hacer nada entonces (restricciones FK ya están allí en las tablas subyacentes). Gracias por la respuesta.
Troy
1
Creo que este es el punto a destacar. No debería necesitar FK en la vista siempre que las tablas subyacentes tengan los FK.
Derek Downey
2
@DTest: podría ser muy útil poder aplicar restricciones, incluidas las restricciones de verificación, clave única y externa a una vista (especialmente si la vista agrega datos). Simplemente sucede que ningún RDBMS actual impone restricciones en las vistas, incluso si le permiten crearlas.
Jack dice que intente topanswers.xyz
@JackDouglas ¡Exactamente correcto! De hecho, vine aquí tratando de averiguar si MySQL admite esa función.
Stijn de Witt
3

En el sentido estricto de la palabra, no, no puede establecer claves foráneas en las vistas. Aquí es por qué:

InnoDB es el único motor de almacenamiento incorporado para MySQL que cuenta con claves foráneas. Cualquier tabla de InnoDB se registrará en information_schema.tables con engine = 'InnoDB'.

Las vistas, mientras están registradas en information_schema.tables, tienen un motor de almacenamiento NULL. No hay mecanismos en MySQL para tener claves foráneas en ninguna tabla que tenga un motor de almacenamiento indefinido.

RolandoMySQLDBA
fuente