Une vue a-t-elle besoin de ses propres contraintes de clé étrangère?


10

Avertissement: je suis un programmeur, pas un DBA, alors soyez indulgent avec moi ...

J'ai une vue que j'utilise pour simplement mapper 2 entités ensemble. Je dois faire une jointure entre quelques tables différentes pour l'obtenir:

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);

Ci-dessus est juste pour le contexte, ne vous inquiétez pas trop à ce sujet. Ce que je dois savoir, c'est comment faire en sorte que les champs de ma nouvelle vue V_SCREENING_GROUP_SITES (SCREENING_GROUP_ID et SITE_ID) se comportent comme des clés étrangères pour les tables SCREENING_GROUP et SITE. Ou est-ce même important?

Si c'était une table je ferais:

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

Mais puisque c'est une vue qui ne fonctionne évidemment pas. Je n'ai pas pu trouver une syntaxe ALTER VIEW qui fonctionne pour définir les FK. Que devrais-je faire?

(Ceci est une base de données MySQL)

Réponses:


12

Une vue est une table logique basée sur une ou plusieurs tables physiques. S'il existe des relations de clé étrangère dans les tables sous-jacentes, elles se manifesteront dans la vue. Les vues dépendent entièrement des tables dont elles dérivent, il n'est donc pas possible d'y ajouter des clés étrangères.


1
Génial, je n'ai donc pas besoin de faire quoi que ce soit alors (contraintes FK déjà présentes dans les tables sous-jacentes). Merci d'avoir répondu.
— Troy

1
Je pense que c'est le point à faire valoir. Vous ne devriez pas avoir besoin de FK sur la vue tant que les tables sous-jacentes ont les FK.
— Derek Downey

2
@DTest - Il pourrait être très utile de pouvoir appliquer des contraintes, y compris des contraintes de vérification, de clé unique et de clé étrangère à une vue (en particulier si la vue regroupe des données). Il arrive simplement qu'aucun SGBDR actuel n'impose de contraintes sur les vues même si elles vous permettent de les créer.
— Jack dit d'essayer topanswers.xyz le

@JackDouglas Exactement raison! En fait, je suis venu ici pour essayer de savoir si MySQL supporte une telle fonctionnalité.
— Stijn de Witt

3

Au sens strict du terme, non, vous ne pouvez pas définir de clés étrangères sur les vues. Voici pourquoi:

InnoDB est le seul moteur de stockage intégré pour MySQL qui dispose de clés étrangères. Toute table InnoDB sera enregistrée dans information_schema.tables avec engine = 'InnoDB'.

Les vues, bien que enregistrées dans information_schema.tables, ont un moteur de stockage NULL. Il n'y a aucun mécanisme dans MySQL pour avoir des clés étrangères sur une table qui a un moteur de stockage non défini.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.