Kami mendeklarasikan batasan SQL FK (FOREIGN KEY) untuk mengatakan bahwa nilai subrow untuk daftar kolom selalu muncul di tempat lain sebagai nilai subrow untuk daftar kolom yang membentuk SQL PK (PRIMARY KEY) atau UNIQUE NOT NULL. Deklarasikan kapan pun itu belum tersirat oleh deklarasi lain. Itu harus merujuk daftar kolom dalam SQL PK (PRIMARY KEY) yang dideklarasikan atau UNIQUE NOT NULL. Jadi, Anda harus mendeklarasikannya dalam tabel yang direferensikan, meskipun itu sudah tersirat oleh NOT NULLs dan PK yang lebih kecil berisi atau UNIQUE NOT NULL.
Jadi perhatikan bahwa SQL PK belum tentu PK dalam arti relasional menjadi unik tetapi tidak berisi kumpulan kolom unik yang lebih kecil, yaitu menjadi superkey yang tidak berisi superkey yang lebih kecil, yaitu menjadi superkey minimal/tidak dapat direduksi, yaitu menjadi CK ( kunci kandidat).
Di sini, Anda mungkin perlu mengganti buildingno
&roomno
FK satu per satu, (buildingno, roomno)
ke Room
:
CONSTRAINT SESSION_FK12
FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES ROOM(BUILDINGNO,ROOMNO)
Itu mungkin sesuai dengan arti tabel Anda--yang sebenarnya tidak Anda berikan, jadi kami tidak tahu, kami hanya bisa menebak. Misalnya jika buildingno
bisa juga dideklarasikan PK atau UNIQUE NOT NULL di Room, yang bila roomno IS NOT NULL
sebenarnya konsisten dengan dan menyiratkan (buildingno, roomno)
bisa dideklarasikan PK atau UNIQUE NOT NULL, mungkin FK anda benar tapi Room
your deklarasi tidak memadai.
Ketika nilai subrow untuk daftar kolom selalu muncul di tempat lain sebagai nilai subrow untuk daftar kolom yang disebut batasan IND (inclusion dependency). Tidak ada cara untuk mendeklarasikan IND non-FK dalam SQL; kita harus menegakkan oleh pemicu. Itu juga mungkin yang Anda butuhkan untuk desain Anda.
Anda bisa menjaga FK dari buildingno
ke Building
, tapi itu tersirat oleh FK yang saya sarankan dan FK di buildingno
di Room
referensi Building
.
mereferensikan bagian dari kunci utama komposit