Saya membaca di Dokumentasi Oracle tentang tabel terpelihara kunci di Memperbarui Bagian Join Views.
Namun, saya tidak menemukan cara sederhana untuk memahaminya.
Saya berharap dapat menerima beberapa detail konseptual sederhana selain Dokumentasi Oracle resmi.
Jawaban:
Kunci terpelihara berarti 1 nilai kunci masuk ke 1 tabel. Memberi contoh balasan dapat membantu Anda memahami konsep ini dengan lebih baik.
Contoh 1:
Tampilan Anda mengandung agregasi. Misalkan Anda memiliki struktur tampilan berikut.
Dalam contoh ini: nilai Anda berasal dari lebih dari satu baris. Jika Anda mencoba memperbarui AverageSalary dalam tampilan ini, database tidak memiliki cara untuk menemukan baris WHICH untuk diperbarui.
Contoh2: Tampilan Anda menunjukkan nilai dari lebih dari satu tabel. Tampilan Anda menunjukkan nilai dari tabel PERSON dan PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).
Baris contoh:
Anda bergabung dengan 2 tabel ini dan menampilkan lebih banyak informasi yang ramah bisnis dalam tampilan.
PersonId, Name, LastName, Phone1, Email1
Di sini Anda ingin memperbarui Phone1 dan Email1. Tetapi personID Anda memetakan ke dua baris yang berbeda, mungkin lebih banyak baris, dalam contoh ini. Dalam pandangan ini, sekali lagi, basis data tidak memiliki cara untuk menemukan baris WHICH untuk diperbarui.
Catatan: Jika Anda membatasi tampilan sql Anda dan memperjelas untuk menemukan baris mana yang akan diperbarui itu berfungsi.
Dua contoh ini adalah contoh pertama yang muncul di benak saya. Mereka dapat ditingkatkan. Tapi konsepnya jelas. Database perlu memetakan 1 nilai kunci ke 1 tabel. Misalnya Anda memiliki tabel PERSON, PERSON_DETAILS, satu ke satu. Di sini tampilan dan pembaruan akan berfungsi karena itu adalah 1-1.
sumber
The dokumentasi Anda telah membaca mengatakan itu cukup baik. Untuk menjelaskan lebih lanjut:
Biasanya suatu
update
tindakan di atas satu meja. Untuk menghindari subquery berliku dalam filter, Oracle memungkinkan Anda untukupdate
melihat (atau subquery) selama masih dapat dengan mudah memetakan perubahan yang Anda buat ke baris yang mendasari nyata dalam sebuah tabel. Ini dimungkinkan jikaset
klausa hanya memodifikasi kolom dalam tabel 'key preserved':Sebagai contoh:
update pertama gagal karena Oracle tidak memiliki cara 1: 1 pemetaan
foo_val
di query kefoo_val
dalamfoo
- sebaliknya update kedua berhasil karena Oracle dapat 1: 1 map masing-masingbar_val
untukbar_val
dibar
. Yang penting adalah yangfoo_id
unik difoo
- jadi untuk setiap barisbar
, hanya ada paling banyak satu baris yang sesuai difoo
(sebenarnya tepat 1 dalam contoh ini, tetapi hal yang sama berlaku untuk kunci asing nullable - intinya adalah bahwa tidak pernah ada lebih dari satu baris).sumber
Biarkan saya memberi contoh dulu dan jelaskan nanti. Pertimbangkan 2 tabel Siswa (t_students) dan Kursus (t_course).
Ketika dua tabel ini bergabung ->
Data yang dihasilkan akan memiliki jumlah baris yang persis sama dengan tabel Siswa. Tidak akan ada nilai duplikat studentid di set hasil (studentid dipertahankan). Namun, meskipun courseid itu unik dalam tabel kursus, itu akan diulang beberapa kali dalam set hasil, karena banyak siswa mungkin memilih untuk kursus yang sama (dengan kata lain, courseid tidak dipertahankan).
Dengan contoh ini, Anda dapat menyimpulkan bahwa:
Ini adalah konsep Key Preserved Tables.
Untuk mengetahui apakah kolom tampilan dapat diperbarui,
PS: berikan nama tabel / tampilan dalam huruf kapital.
sumber