sql >> Base de Datos >  >> RDS >> Oracle

Cómo hacer referencia a una clave principal compuesta en SQL

Declaramos una restricción SQL FK (FOREIGN KEY) para decir que un valor de subbrow para una lista de columnas siempre aparece en otro lugar como un valor de subbrow para una lista de columnas que forman un SQL PK (CLAVE PRINCIPAL) o ÚNICO NO NULO. Declararlo siempre que no esté implícito en otras declaraciones. Debe hacer referencia a la lista de columnas en un SQL PK declarado (CLAVE PRINCIPAL) o ÚNICO NO NULO. Por lo tanto, debe declarar eso en la tabla a la que se hace referencia, incluso si eso ya está implícito en NOT NULL y un PK contenido más pequeño o UNIQUE NOT NULL.

Así que tenga en cuenta que una PK de SQL no es necesariamente una PK en el sentido relacional de ser única pero no contener un conjunto de columnas único más pequeño, es decir, ser una superclave que no contenga una superclave más pequeña, es decir, ser una superclave mínima/irreducible, es decir, ser una CK ( clave candidata).

Aquí, es posible que deba reemplazar el buildingno &roomno FK por uno, (buildingno, roomno) a Room :

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

Eso podría sea ​​apropiado para los significados de sus tablas, que de hecho no proporciona, por lo que no podemos saber, solo podemos adivinar. Por ejemplo, si buildingno podría también ser declarado PK o UNIQUE NOT NULL en Room, que cuando roomno IS NOT NULL en realidad es consistente con e implica (buildingno, roomno) podría declararse PK o UNIQUE NOT NULL, tal vez su FK sea correcto pero tu Room las declaraciones son inadecuadas.

Cuando un valor de subfila para una lista de columnas siempre aparece en otro lugar como un valor de subfila para una lista de columnas, se denomina restricción IND (dependencia de inclusión). No hay forma de declarar un IND que no sea FK en SQL; debemos hacer cumplir mediante gatillos. Que también podría ser lo que necesitas para tu diseño.

Podrías evitar que el FK buildingno a Building , pero está implícito en el FK que sugiero y el FK en buildingno en Room haciendo referencia a Building .

haciendo referencia a parte de la clave primaria compuesta