Deklarujeme omezení SQL FK (FOREIGN KEY), které říká, že hodnota podřádku pro seznam sloupců se vždy objeví jinde jako hodnota podřádku pro seznam sloupců, který tvoří SQL PK (PRIMARY KEY) nebo UNIQUE NOT NULL. Deklarujte to, kdykoli to již není implikováno jinými deklaracemi. Musí odkazovat na seznam sloupců v deklarovaném SQL PK (PRIMARY KEY) nebo UNIQUE NOT NULL. Takže to musíte deklarovat v odkazované tabulce, i když je to již implikováno hodnotami NOT NULL a menším obsaženým PK nebo UNIQUE NOT NULL.
Všimněte si tedy, že SQL PK není nutně PK v relačním smyslu, že je jedinečný, ale neobsahuje menší sadu jedinečných sloupců, tj. je superklíčem, který neobsahuje menší superklíč, tj. je minimálním/neredukovatelným superklíčem, tj. je CK ( kandidátský klíč).
Zde možná budete muset nahradit buildingno
&roomno
FKs o jeden, (buildingno, roomno)
do Room
:
CONSTRAINT SESSION_FK12
FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES ROOM(BUILDINGNO,ROOMNO)
To může být vhodné pro významy vašich tabulek – které ve skutečnosti neuvádíte, takže to nemůžeme vědět, můžeme jen hádat. Např. pokud buildingno
mohl také být deklarován jako PK nebo UNIQUE NOT NULL v místnosti, což když roomno IS NOT NULL
je ve skutečnosti v souladu s a implikuje (buildingno, roomno)
může být prohlášeno za PK nebo UNIQUE NOT NULL, možná je váš FK správný ale váš Room
deklarace jsou nedostatečné.
Když se hodnota podřádku pro seznam sloupců vždy objeví jinde jako hodnota podřádku pro seznam sloupců, nazývá se to omezení IND (inclusion dependency). Neexistuje způsob, jak deklarovat non-FK IND v SQL; musíme prosadit pomocí spouštěčů. To také může být to, co potřebujete pro svůj design.
Můžete nechat FK od buildingno
do Building
, ale je to implikováno FK, který navrhuji, a FK v buildingno
na Room
odkazující na Building
.
odkazující na část složeného primárního klíče