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)
la source
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.
la source