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