Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment référencer une clé primaire composite en SQL

Nous déclarons une contrainte SQL FK (FOREIGN KEY) pour dire qu'une valeur de sous-ligne pour une liste de colonnes apparaît toujours ailleurs comme une valeur de sous-ligne pour une liste de colonnes qui forme une SQL PK (PRIMARY KEY) ou UNIQUE NOT NULL. Déclarez-le chaque fois qu'il n'est pas déjà impliqué par d'autres déclarations. Il doit référencer la liste des colonnes dans un SQL déclaré PK (PRIMARY KEY) ou UNIQUE NOT NULL. Vous devez donc déclarer cela dans la table référencée, même si cela est déjà impliqué par NOT NULLs et un PK contenu plus petit ou UNIQUE NOT NULL.

Notez donc qu'un SQL PK n'est pas nécessairement un PK dans le sens relationnel d'être unique mais ne contenant pas un ensemble de colonnes unique plus petit, c'est-à-dire être une super-clé ne contenant pas de super-clé plus petite, c'est-à-dire être une super-clé minimale/irréductible, c'est-à-dire être un CK ( clé candidate).

Ici, vous devrez peut-être remplacer le buildingno &roomno FKs par un, (buildingno, roomno) à Room :

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

Cela pourrait être approprié pour les significations de vos tableaux - ce que vous ne donnez pas en fait, donc nous ne pouvons pas savoir, nous ne pouvons que deviner. Par exemple, si buildingno pourrait aussi être déclaré PK ou UNIQUE NOT NULL dans Room, qui lorsque roomno IS NOT NULL est en fait cohérent avec et implique (buildingno, roomno) pourrait être déclaré PK ou UNIQUE NOT NULL, peut-être que votre FK est correct mais votre Room les déclarations sont inadéquates.

Lorsqu'une valeur de sous-ligne pour une liste de colonnes apparaît toujours ailleurs en tant que valeur de sous-ligne pour une liste de colonnes, cela s'appelle une contrainte IND (dépendance d'inclusion). Il n'y a aucun moyen de déclarer un IND non-FK dans SQL ; nous devons appliquer par des déclencheurs. Cela aussi pourrait être ce dont vous avez besoin pour votre conception.

Vous pouvez conserver le FK de buildingno à Building , mais c'est sous-entendu par le FK que je suggère et le FK dans buildingno sur Room faisant référence à Building .

référençant une partie de la clé primaire composite