SQL FK(FOREIGN KEY)制約を宣言して、列のリストのサブ行値が、SQL PK(PRIMARY KEY)またはUNIQUENOTNULLを形成する列のリストのサブ行値として常に他の場所に表示されるようにします。他の宣言によってまだ暗示されていない場合はいつでも宣言してください。宣言されたSQLPK(PRIMARY KEY)またはUNIQUENOTNULLの列リストを参照する必要があります。したがって、NOT NULLによってすでに暗示されていて、含まれているPKまたはUNIQUE NOT NULLが小さい場合でも、参照されるテーブルでそれを宣言する必要があります。
したがって、SQL PKは、一意であるが小さい一意の列セットを含まないという関係的な意味でのPKである必要はありません。つまり、小さいスーパーキーを含まないスーパーキーである、つまり最小/還元不可能なスーパーキーである、つまりCK(候補キー)。
ここで、buildingno
を置き換える必要があるかもしれません &roomno
FKを1つずつ、(buildingno, roomno)
Room
へ :
CONSTRAINT SESSION_FK12
FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES ROOM(BUILDINGNO,ROOMNO)
かもしれない あなたのテーブルの意味に適切である-実際にはあなたが与えていないので、私たちは知ることができず、推測することしかできません。例:buildingno
また RoomでPKまたはUNIQUENOTNULLと宣言されます。これは、roomno IS NOT NULL
の場合です。 実際には(buildingno, roomno)
と一致し、それを意味します PKまたはUNIQUENOTNULLと宣言できます。おそらく、FKは正しい しかし、あなたのRoom
宣言は不十分です。
列のリストのサブ行値が常に列のリストのサブ行値として他の場所に表示される場合、これはIND(包含依存)制約と呼ばれます。 SQLで非FKINDを宣言する方法はありません。トリガーによって強制する必要があります。そのまた デザインに必要なものかもしれません。
FKをbuildingno
から守ることができます Building
へ 、しかしそれは私が提案するFKとbuildingno
のFKによって暗示されています Room
Building
を参照する 。