sql >> Databasteknik >  >> RDS >> Oracle

Hur man refererar till en sammansatt primärnyckel i SQL

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 buildingnoRoom hänvisar till Building .

refererar till en del av den sammansatta primärnyckeln



  1. Hur lagrar jag korrelationsvärden mellan användare i en databas med MySQL och PHP?

  2. Hur kan jag ändra SID för en Oracle XE-instans

  3. SQL Server:kombinera flera rader till en rad

  4. Sökfiltrering med PHP/MySQL