Vi deklarerar en SQL FK (FOREIGN KEY)-begränsning för att säga att ett underradsvärde för en lista med kolumner alltid visas någon annanstans som ett underradsvärde för en lista med kolumner som bildar en SQL PK (PRIMARY KEY) eller UNIQUE NOT NULL. Deklarera det när det inte redan antyds av andra deklarationer. Den måste referera till kolumnlistan i en deklarerad SQL PK (PRIMARY KEY) eller UNIQUE NOT NULL. Så du måste deklarera det i den refererade tabellen, även om det redan antyds av NOT NULL och en mindre PK eller UNIQUE NOT NULL.
Så notera att en SQL PK inte nödvändigtvis är en PK i den relationella betydelsen av att vara unik men inte innehålla en mindre unik kolumnuppsättning, dvs att vara en supernyckel som inte innehåller en mindre supernyckel, dvs vara en minimal/oreducerbar supernyckel, dvs vara en CK ( kandidatnyckel).
Här kan du behöva ersätta buildingno
&roomno
FKs av en, (buildingno, roomno)
till Room
:
CONSTRAINT SESSION_FK12
FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES ROOM(BUILDINGNO,ROOMNO)
Det kan vara lämplig för betydelsen av dina tabeller - som du faktiskt inte ger, så vi kan inte veta, vi kan bara gissa. T.ex. om buildingno
kunde också deklareras PK eller UNIQUE NOT NULL i rummet, vilket när roomno IS NOT NULL
är faktiskt överensstämmande med och antyder (buildingno, roomno)
kan deklareras PK eller UNIQUE NOT NULL, kanske din FK har rätt men ditt Room
deklarationer är otillräckliga.
När ett underradsvärde för en lista med kolumner alltid visas någon annanstans som ett underradsvärde för en lista med kolumner som kallas en IND-restriktion (inkluderingsberoende). Det finns inget sätt att deklarera en icke-FK IND i SQL; vi måste genomdriva med utlösare. Det också kan vara vad du behöver för din design.
Du kan hålla FK från buildingno
till Building
, men det antyds av FK jag föreslår och FK i buildingno
på Room
hänvisar till Building
.
refererar till en del av den sammansatta primärnyckeln