Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como fazer referência a uma chave primária composta no SQL


Declaramos uma restrição SQL FK (FOREIGN KEY) para dizer que um valor de sublinha para uma lista de colunas sempre aparece em outro lugar como um valor de sublinha para uma lista de colunas que forma um SQL PK (PRIMARY KEY) ou UNIQUE NOT NULL. Declare-o sempre que não estiver implícito em outras declarações. Ele deve referenciar a lista de colunas em um SQL PK declarado (PRIMARY KEY) ou UNIQUE NOT NULL. Portanto, você deve declarar isso na tabela referenciada, mesmo que isso já esteja implícito por NOT NULLs e um PK ou UNIQUE NOT NULL menor contido.

Portanto, observe que um SQL PK não é necessariamente um PK no sentido relacional de ser único, mas não contendo um conjunto de colunas único menor, ou seja, sendo uma superchave não contendo uma superchave menor, ou seja, sendo uma superchave mínima/irredutível, ou seja, sendo um CK ( Chave candidata).

Aqui, você pode precisar substituir o buildingno &roomno FKs por um, (buildingno, roomno) para Room :
CONSTRAINT SESSION_FK12
    FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES ROOM(BUILDINGNO,ROOMNO)

Isso pode ser apropriado para os significados de suas tabelas - que na verdade você não dá, então não podemos saber, só podemos adivinhar. Por exemplo, se buildingno poderia também ser declarado PK ou UNIQUE NOT NULL em Room, que quando roomno IS NOT NULL é realmente consistente com e implica (buildingno, roomno) pode ser declarado PK ou UNIQUE NOT NULL, talvez seu FK esteja certo mas sua Room declarações são insuficientes.

Quando um valor de sublinha para uma lista de colunas sempre aparece em outro lugar como um valor de sublinha para uma lista de colunas que é chamada de restrição IND (dependência de inclusão). Não há como declarar um IND não FK no SQL; devemos impor por gatilhos. Isso também pode ser o que você precisa para o seu projeto.

Você pode manter o FK de buildingno para Building , mas está implícito no FK que sugiro e no FK em buildingno na Room referenciando Building .

parte de referência da chave primária composta