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.