Una vista ha bisogno dei propri vincoli di chiave esterna?


10

Disclaimer: sono un programmatore, non un DBA, quindi abbi pazienza con me ...

Ho una vista che uso solo per mappare 2 entità insieme. Devo fare un join tra alcune tabelle diverse per ottenere questo:

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

Sopra è solo per il contesto, non ti preoccupare troppo. Quello che devo sapere è come fare in modo che i campi nella mia nuova vista V_SCREENING_GROUP_SITES (SCREENING_GROUP_ID e SITE_ID) si comportino come chiavi esterne per le tabelle SCREENING_GROUP e SITE. O importa?

Se fosse un tavolo farei:

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

Ma dal momento che è una vista che ovviamente non funziona. Non sono riuscito a trovare una sintassi ALTER VIEW che funzioni per l'impostazione degli FK. Cosa dovrei fare?

(Questo è un database MySQL)

Risposte:


12

Una vista è una tabella logica basata su una o più tabelle fisiche. Se nelle tabelle sottostanti sono presenti relazioni di chiave esterna, verranno visualizzate nella vista. Le viste dipendono interamente dalle tabelle da cui derivano, quindi non è possibile provare ad aggiungere chiavi esterne.


1
Fantastico, quindi non ho bisogno di fare nulla (vincoli FK già presenti nelle tabelle sottostanti). Grazie per la risposta.
Troia,

1
Penso che questo sia il punto da chiarire. Non dovresti avere bisogno di FK nella vista fintanto che le tabelle sottostanti hanno gli FK.
Derek Downey,

2
@DTest: potrebbe essere molto utile poter applicare vincoli, inclusi controlli, vincoli di chiavi univoci ed esterni a una vista (specialmente se la vista aggrega i dati). Accade semplicemente che nessun RDBMS corrente imponga vincoli sulle viste anche se consentono di crearli.
Jack dice di provare topanswers.xyz il

@JackDouglas Esattamente! In effetti sono venuto qui cercando di scoprire se MySQL supporta tale funzionalità.
Stijn de Witt,

3

Nel senso stretto della parola, no, non è possibile impostare chiavi esterne nelle viste. Ecco perché:

InnoDB è l'unico motore di archiviazione integrato per MySQL che dispone di chiavi esterne. Qualsiasi tabella InnoDB verrà registrata in information_schema.tables con engine = 'InnoDB'.

Le viste, mentre sono registrate in information_schema.tables, hanno un motore di archiviazione NULL. Non ci sono meccanismi in MySQL per avere chiavi esterne su qualsiasi tabella che abbia un motore di archiviazione indefinito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.