Oracle
 sql >> Database >  >> RDS >> Oracle

Come fare riferimento a una chiave primaria composita in SQL

Dichiariamo un vincolo SQL FK (FOREIGN KEY) per dire che un valore subrow per un elenco di colonne appare sempre altrove come valore subrow per un elenco di colonne che forma un SQL PK (PRIMARY KEY) o UNIQUE NOT NULL. Dichiaralo ogni volta che non è già implicito in altre dichiarazioni. Deve fare riferimento all'elenco di colonne in una PK SQL dichiarata (CHIAVE PRIMARIA) o UNIQUE NOT NULL. Quindi devi dichiararlo nella tabella di riferimento, anche se è già implicito da NOT NULL e un PK contenuto più piccolo o UNIQUE NOT NULL.

Quindi si noti che una PK SQL non è necessariamente una PK nel senso relazionale di essere univoca ma non contenente un insieme di colonne univoco più piccolo, cioè essendo una superchiave non contenente una superchiave più piccola, cioè essendo una superchiave minima/irriducibile, cioè essendo una CK ( chiave candidata).

Qui potrebbe essere necessario sostituire buildingno &roomno FK per uno, (buildingno, roomno) a Room :

CONSTRAINT SESSION_FK12
    FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES ROOM(BUILDINGNO,ROOMNO)

Questo potrebbe sia appropriato per i significati delle tue tabelle - che in realtà non dai, quindi non possiamo sapere, possiamo solo indovinare. Ad esempio, se buildingno potrebbe anche essere dichiarato PK o UNIQUE NOT NULL in Room, che quando roomno IS NOT NULL è effettivamente coerente con e implica (buildingno, roomno) potrebbe essere dichiarato PK o UNIQUE NOT NULL, forse il tuo FK è giusto ma la tua Room le dichiarazioni sono inadeguate.

Quando un valore subrow per un elenco di colonne viene sempre visualizzato altrove come valore subrow per un elenco di colonne chiamato vincolo IND (dipendenza di inclusione). Non c'è modo di dichiarare un IND non FK in SQL; dobbiamo far rispettare dai trigger. Questo anche potrebbe essere ciò di cui hai bisogno per il tuo design.

Potresti mantenere l'FK da buildingno a Building , ma è implicito nell'FK che suggerisco e nell'FK in buildingno su Room facendo riferimento a Building .

riferimento a parte della chiave primaria composita