Czy widok potrzebuje własnych ograniczeń klucza obcego?

10

Oświadczenie: Jestem programistą, a nie DBA, więc proszę o cierpliwość ...

Mam widok, którego używam do mapowania 2 jednostek razem. Muszę wykonać połączenie między kilkoma różnymi tabelami, aby to uzyskać:

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

Powyżej jest tylko dla kontekstu, nie przejmuj się tym zbytnio. Muszę wiedzieć, jak sprawić, aby pola w moim nowym widoku V_SCREENING_GROUP_SITES (SCREENING_GROUP_ID i SITE_ID) zachowywały się jak klucze obce do tabel SCREENING_GROUP i SITE. Czy to w ogóle ma znaczenie?

Gdyby to był stół, zrobiłbym:

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

Ale ponieważ jest to pogląd, który oczywiście nie działa. Nie mogłem znaleźć składni ALTER VIEW, która działa w celu ustawienia FK. Co powinienem zrobić?

(To jest baza danych MySQL)

Troja
źródło

Odpowiedzi:

12

Widok to logiczna tabela oparta na jednej lub więcej tabel fizycznych. Jeśli w bazowych tabelach istnieją relacje kluczy obcych, zostaną one zamanifestowane w widoku. Widoki są całkowicie zależne od tabel, z których pochodzą, więc próba dodania do nich obcych kluczy nie jest możliwa.

gview
źródło
1
Świetnie, więc nie muszę wtedy nic robić (ograniczenia FK już istnieją w tabelach poniżej). Dziękuję za odpowiedź.
Troy
1
Myślę, że to jest punkt do zrobienia. Nie powinieneś potrzebować FK w widoku, dopóki podstawowe tabele mają FK.
Derek Downey,
2
@DTest - Przydatne może być zastosowanie ograniczeń, w tym ograniczeń sprawdzania, unikatowych i obcych kluczy do widoku (szczególnie jeśli widok agreguje dane). Zdarza się, że żadne obecne RDBMS nie wymuszają ograniczeń widoków, nawet jeśli pozwalają na ich utworzenie.
Jack mówi, że spróbuj topanswers.xyz
@JackDouglas Dokładnie tak! W rzeczywistości przybyłem tutaj, aby dowiedzieć się, czy MySQL obsługuje taką funkcję.
Stijn de Witt
3

W ścisłym tego słowa znaczeniu nie można ustawić obcych kluczy w widokach. Oto dlaczego:

InnoDB jest jedynym wbudowanym silnikiem pamięci dla MySQL, który zawiera klucze obce. Każda tabela InnoDB zostanie zarejestrowana w information_schema.tables z silnikiem = „InnoDB”.

Widoki, zarejestrowane w information_schema.tables, mają silnik pamięci NULL. W MySQL nie ma mechanizmów, aby mieć klucze obce w dowolnej tabeli, która ma niezdefiniowany silnik pamięci.

RolandoMySQLDBA
źródło