sql >> Database >  >> RDS >> Oracle

Hoe te verwijzen naar een samengestelde primaire sleutel in SQL

We declareren een SQL FK (FOREIGN KEY)-beperking om te zeggen dat een subrijwaarde voor een lijst met kolommen altijd ergens anders verschijnt als een subrijwaarde voor een lijst met kolommen die een SQL PK (PRIMARY KEY) of UNIQUE NOT NULL vormt. Verklaar het wanneer het nog niet door andere verklaringen wordt geïmpliceerd. Het moet verwijzen naar de kolomlijst in een gedeclareerde SQL PK (PRIMARY KEY) of UNIQUE NOT NULL. Je moet dat dus aangeven in de tabel waarnaar wordt verwezen, zelfs als dat al wordt geïmpliceerd door NOT NULL's en een kleinere PK of UNIQUE NOT NULL.

Merk dus op dat een SQL PK niet noodzakelijkerwijs een PK is in de relationele zin van uniek zijn maar geen kleinere unieke kolommenset bevatten, dwz een supersleutel zijn die geen kleinere supersleutel bevat, dwz een minimale/onherleidbare supersleutel zijn, dwz een CK zijn ( kandidaatsleutel).

Hier moet u mogelijk het buildingno . vervangen &roomno FK's met één, (buildingno, roomno) naar Room :

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

Dat misschien geschikt zijn voor de betekenissen van uw tabellen - die u in feite niet geeft, dus we kunnen het niet weten, we kunnen alleen maar raden. Bijv. als buildingno kan ook worden verklaard PK of UNIEK NIET NULL in Kamer, die wanneer roomno IS NOT NULL is eigenlijk consistent met en impliceert (buildingno, roomno) kan als PK of UNIEK NIET NULL worden verklaard, misschien is uw FK juist maar je Room declaraties zijn ontoereikend.

Wanneer een subrijwaarde voor een lijst met kolommen altijd ergens anders verschijnt als een subrijwaarde voor een lijst met kolommen, wordt dit een IND-beperking (inclusieafhankelijkheid) genoemd. Er is geen manier om een ​​niet-FK IND in SQL te declareren; we moeten afdwingen door triggers. Dat ook is misschien wat je nodig hebt voor je ontwerp.

Je zou de FK van buildingno kunnen houden naar Building , maar het wordt geïmpliceerd door de FK die ik voorstel en de FK in buildingno op Room verwijzend naar Building .

verwijzend naar een deel van de samengestelde primaire sleutel



  1. Oracle SQL - Converteer kolomwaarden van N rijen naar N kolommen in 1 rij

  2. het lezen van MySQL is sneller of het lezen van een bestand is sneller?

  3. Hoe kan ik een tabel herhalen met de gecombineerde resultaten van twee vergelijkbare query's uit twee verschillende databases?

  4. Hoe het aantal en de namen van verschillende tekens in een string in PL/SQL te vinden?