Disclaimer: Eu sou um programador, não um DBA, então tenha paciência comigo ...
Eu tenho uma visão que eu uso para mapear apenas 2 entidades juntas. Eu tenho que fazer uma junção entre algumas tabelas diferentes para conseguir isso:
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);
Acima é apenas para contexto, não se preocupe muito com isso. O que eu preciso saber é como fazer com que os campos na minha nova exibição V_SCREENING_GROUP_SITES (SCREENING_GROUP_ID e SITE_ID) se comportem como chaves estrangeiras nas tabelas SCREENING_GROUP e SITE. Ou isso importa?
Se fosse uma mesa eu faria:
ALTER TABLE V_SCREENING_GROUP_SITES
ADD CONSTRAINT FK_SCREENING_GROUP_ID
FOREIGN KEY (SCREENING_GROUP_ID)
REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID;
...
Mas já que é uma visão que obviamente não funciona. Não consegui encontrar uma sintaxe ALTER VIEW que funcione para definir FKs. O que devo fazer?
(Este é um banco de dados MySQL)
fonte
No sentido estrito da palavra, não, você não pode definir chaves estrangeiras nas visualizações. Aqui está o porquê:
O InnoDB é o único mecanismo de armazenamento interno para MySQL que possui chaves estrangeiras. Qualquer tabela do InnoDB será registrada em information_schema.tables com engine = 'InnoDB'.
As visualizações, enquanto registradas em information_schema.tables, possuem um mecanismo de armazenamento NULL. Não há mecanismos no MySQL para ter chaves estrangeiras em qualquer tabela que tenha um mecanismo de armazenamento indefinido.
fonte