Tolong jelaskan dua hal untuk saya:
- Bisakah kunci asing menjadi NULL?
- Bisakah kunci asing digandakan?
Seadil yang saya tahu, NULL
tidak boleh digunakan dalam kunci asing, tetapi dalam beberapa aplikasi saya, saya dapat memasukkan NULL
Oracle dan SQL Server, dan saya tidak tahu mengapa.
sql
sql-server
oracle
foreign-keys
selai
sumber
sumber
Jawaban:
Jawaban singkat: Ya, bisa NULL atau duplikat.
Saya ingin menjelaskan mengapa kunci asing mungkin harus nol atau mungkin harus unik atau tidak unik. Pertama-tama ingat kunci Asing hanya mensyaratkan bahwa nilai dalam bidang itu harus ada terlebih dahulu di tabel yang berbeda (tabel induk). Itu semua adalah definisi FK. Null menurut definisi bukan nilai. Null berarti kita belum tahu nilainya.
Biarkan saya memberi Anda contoh kehidupan nyata. Misalkan Anda memiliki database yang menyimpan proposal penjualan. Anggap lebih jauh bahwa setiap proposal hanya memiliki satu tenaga penjualan yang ditugaskan dan satu klien. Jadi tabel proposal Anda akan memiliki dua kunci asing, satu dengan ID klien dan satu dengan ID staf penjualan. Namun, pada saat catatan dibuat, seorang tenaga penjualan tidak selalu ditugaskan (karena belum ada yang bebas untuk mengerjakannya), sehingga ID klien diisi tetapi ID tenaga penjualan mungkin nol. Dengan kata lain, biasanya Anda membutuhkan kemampuan untuk memiliki null FK ketika Anda mungkin tidak tahu nilainya pada saat data dimasukkan, tetapi Anda tahu nilai-nilai lain dalam tabel yang perlu dimasukkan. Untuk mengizinkan nol di FK umumnya yang harus Anda lakukan adalah mengizinkan nol di bidang yang memiliki FK. Nilai nol terpisah dari ide menjadi FK.
Apakah itu unik atau tidak unik berkaitan dengan apakah tabel memiliki hubungan satu-satu atau banyak-ke tabel induk. Sekarang jika Anda memiliki hubungan satu-satu, ada kemungkinan bahwa Anda dapat memiliki semua data dalam satu tabel, tetapi jika tabel menjadi terlalu luas atau jika data berada pada topik yang berbeda (karyawan - contoh asuransi @tbone memberi misalnya), maka Anda ingin tabel terpisah dengan FK. Anda kemudian ingin membuat FK ini juga sebagai PK (yang menjamin keunikan) atau menempatkan batasan unik di atasnya.
Sebagian besar FK adalah untuk hubungan satu ke banyak dan itulah yang Anda dapatkan dari FK tanpa menambah kendala lebih lanjut di lapangan. Jadi, Anda memiliki tabel pesanan dan tabel detail pesanan misalnya. Jika pelanggan memesan sepuluh item sekaligus, ia memiliki satu pesanan dan sepuluh catatan detail pesanan yang berisi ID pemesanan yang sama dengan FK.
sumber
NULL
di satu meja dengan beberapaNULL
s di tabel yang berbeda.1 - Ya, setidaknya SQL Server 2000.
2 - Ya, selama itu bukan
UNIQUE
kendala atau tertaut ke indeks unik.sumber
Dari mulut kuda:
Lihat ini:
Tautan Oracle 11g
sumber
Ya kunci asing bisa nol seperti yang dikatakan di atas oleh programmer senior ... Saya akan menambahkan skenario lain di mana kunci Asing akan diminta menjadi nol .... misalkan kita memiliki tabel komentar, Gambar dan Video dalam aplikasi yang memungkinkan komentar pada gambar dan video. Dalam tabel komentar kita dapat memiliki dua PicturesId Kunci Asing, dan VideosId bersama dengan CommentId Kunci utama. Jadi ketika Anda mengomentari video, hanya VideosId yang diperlukan dan pictureId akan menjadi nol ... dan jika Anda mengomentari gambar, hanya PictureId yang diperlukan dan VideosId akan menjadi nol ...
sumber
itu tergantung pada peran apa yang
foreign key
dimainkannya dalam hubungan Anda.foreign key
juga akey attribute
dalam hubungan Anda, maka itu tidak bisa NULLforeign key
adalah atribut normal dalam relasi Anda, maka itu bisa NULL.sumber
Berikut ini contoh menggunakan sintaks Oracle:
Pertama mari kita buat tabel COUNTRY
Buat tabel PROVINCE
Ini berjalan dengan baik di Oracle. Perhatikan kunci asing COUNTRY_ID di tabel kedua tidak memiliki "NOT NULL".
Sekarang untuk menyisipkan baris ke dalam tabel PROVINCE, cukup untuk menentukan PROVINCE_ID saja. Namun, jika Anda memilih untuk menentukan COUNTRY_ID juga, itu harus sudah ada di tabel COUNTRY.
sumber
Secara default tidak ada batasan pada kunci asing, kunci asing dapat menjadi nol dan duplikat.
saat membuat tabel / mengubah tabel, jika Anda menambahkan batasan keunikan atau bukan nol maka hanya itu yang tidak akan memungkinkan nilai null / duplikat.
sumber
Sederhananya, hubungan "Tidak Mengidentifikasi" antara Entitas adalah bagian dari ER-Model dan tersedia di Microsoft Visio ketika merancang ER-Diagram. Ini diperlukan untuk menegakkan kardinalitas antara Entitas tipe "nol atau lebih dari nol", atau "nol atau satu". Catat "nol" ini dalam kardinalitas alih-alih "satu" dalam "satu ke banyak".
Sekarang, contoh hubungan non-identifikasi di mana kardinalitas mungkin "nol" (non-mengidentifikasi) adalah ketika kita mengatakan catatan / objek dalam satu entitas-A "mungkin" atau "mungkin tidak" memiliki nilai sebagai referensi ke catatan / s di Entitas lain-B.
Seperti, ada kemungkinan untuk satu catatan entitas-A untuk mengidentifikasi dirinya dengan catatan Entitas-B lainnya, oleh karena itu harus ada kolom di Entitas-B untuk memiliki nilai identitas dari catatan Entitas-B. Kolom ini mungkin "Null" jika tidak ada catatan di Entity-A mengidentifikasi rekaman / s (atau, objek / s) di Entity-B.
Dalam Paradigma Berorientasi Objek (dunia nyata), ada situasi ketika objek Kelas-B tidak selalu bergantung (sangat berpasangan) pada objek kelas-A untuk keberadaannya, yang berarti Kelas-B secara longgar digabungkan dengan Kelas- A sedemikian sehingga Kelas-A dapat "Mengandung" (Containment) objek Kelas-A, yang bertentangan dengan konsep objek Kelas-B harus memiliki (Komposisi) objek Kelas-A, untuk (objek kelas-nya) B) penciptaan.
Dari sudut pandang SQL Query, Anda bisa meminta semua catatan dalam entitas-B yang "tidak nol" untuk kunci asing yang disediakan untuk Entity-B. Ini akan membawa semua catatan yang memiliki nilai tertentu yang sesuai untuk baris di Entity-A atau semua catatan dengan nilai Null akan menjadi catatan yang tidak memiliki catatan apa pun di Entity-A di Entity-B.
sumber
Saya pikir lebih baik mempertimbangkan kemungkinan kardinalitas yang kita miliki di tabel. Kita dapat memiliki kardinalitas minimum nol. Ketika itu opsional, partisipasi minimum tupel dari tabel terkait bisa nol, Sekarang Anda menghadapi keharusan nilai kunci asing diizinkan nol.
Tetapi jawabannya adalah itu semua tergantung pada Bisnis.
sumber
Gagasan kunci asing didasarkan pada konsep referensi nilai yang sudah ada di tabel utama. Itu sebabnya disebut kunci asing di tabel lain. Konsep ini disebut integritas referensial. Jika kunci asing dinyatakan sebagai bidang nol, itu akan melanggar logika integritas referensial. Apa yang dimaksud? Itu hanya bisa merujuk ke sesuatu yang ada di tabel utama. Oleh karena itu, saya pikir akan salah untuk menyatakan bidang kunci asing sebagai nol.
sumber
NULL
, tetapi apa yang dikatakan integritas referensial adalah bahwa jika referensi "sesuatu" itu harus ada di sana.Saya pikir kunci asing dari satu tabel juga kunci utama ke beberapa tabel lainnya. Jadi itu tidak akan mengizinkan nulls.Jadi tidak ada pertanyaan tentang memiliki nilai nol dalam kunci asing.
sumber