Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Batasan Kunci Asing di tabel anak memungkinkan untuk memasukkan nilai yang tidak ada di tabel induk

Pertama, kami memiliki praktis alasan. Kunci asing dipelihara dan diperiksa menggunakan indeks. Agar indeks dapat digunakan, kita perlu mengetahui nilai (yang dicari) dari semua kolom dalam indeks. Jika kita memiliki indeks/pk pada (a,b) dan kami memiliki nilai kunci asing (NULL,1) , kita tidak bisa mencari dalam indeks untuk menentukan apakah ada baris dengan b nilai 1. Ini akan membuat kunci asing "mahal" untuk dipelihara.

Tapi kedua, kita perlu mempertimbangkan konsistensi. Untuk kasus kolom tunggal, ini cukup tidak kontroversial - jika Anda memiliki nilai di kolom FK, maka perlu ada nilai yang cocok di kolom yang direferensikan. Jika tidak, jika kolom FK adalah NULL maka batasannya tidak dicentang.

Tapi, bagaimana kita memperluas ini ke beberapa kolom? Apa itu aturan di atas? Tidak ada satu interpretasi yang jelas, tetapi lebih dari itu. Apakah aturan di atas "jika semua kolom bukan NULL, maka batasannya dicentang" atau "jika ada kolom bukan NULL, maka batasannya dicentang"? Aturan ini identik ketika hanya satu kolom yang dipertimbangkan.

Anda mengharapkan aturan menjadi yang kedua, padahal sebenarnya yang pertama. Ini secara eksplisit didokumentasikan :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlFunction gagal membuka koneksi konteks meskipun DataAccessKind.Read hadir

  2. Cara mengurangi ukuran tabel SQL Server yang tumbuh dari perubahan tipe data

  3. Masalah menggunakan ROW_NUMBER() OVER (PARTITION BY ...)

  4. Gabungkan Dua Partisi Menjadi Satu di SQL Server (T-SQL)

  5. Parameter opsional di server SQL