it-swarm.asia

Apakah konsep Key Preserved Table?

Saya membaca di Dokumentasi Oracle tentang tabel terpelihara kunci di Memperbarui Bagian Join Views.

Namun, saya tidak menemukan cara sederhana untuk memahaminya.

Saya berharap untuk menerima beberapa detail konseptual sederhana selain Dokumentasi Oracle resmi.

12
parmanand

Kunci terpelihara berarti 1 nilai kunci masuk ke 1 tabel. Memberi contoh balasan dapat membantu Anda memahami konsep ini dengan lebih baik.

Example1:

Tampilan Anda mengandung agregasi. Misalkan Anda memiliki struktur tampilan berikut.

GroupID, AverageSalary
1 , 10000
2, 12000
3, 14000

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.

Example2: 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:

 1,1,email,[email protected]
 1,1,phone,898-98-99

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.

7
Atilla Ozgur

dokumentasi yang sudah Anda baca mengatakannya dengan cukup baik. Untuk menjelaskan lebih lanjut:

Konsep tabel terpelihara kunci sangat penting untuk memahami pembatasan memodifikasi pandangan bergabung.

Biasanya update bekerja pada satu tabel. Untuk menghindari subquery berliku dalam filter, Oracle memungkinkan Anda untuk update tampilan (atau subquery) selama masih dapat dengan mudah memetakan perubahan yang Anda buat ke baris yang mendasari nyata dalam sebuah tabel. Ini dimungkinkan jika klausa set hanya memodifikasi kolom dalam tabel 'terpelihara kunci':

Sebuah tabel disimpan kunci jika setiap kunci tabel juga bisa menjadi kunci dari hasil gabungan. Jadi, tabel kunci-diawetkan kunci disimpan melalui gabungan.

Sebagai contoh:

create table foo( foo_id integer primary key, foo_val integer not null );
create table bar( bar_id integer primary key, bar_val integer not null, 
                  foo_id integer not null references foo );

update (select * from foo join bar using(foo_id)) set foo_val=1;
ORA-01779: cannot modify a column which maps to a non key-preserved table

update (select * from foo join bar using(foo_id)) set bar_val=1;
0 rows updated.

pembaruan pertama gagal karena Oracle tidak memiliki cara pemetaan 1: 1 foo_val dalam permintaan ke foo_val di foo - sebaliknya pembaruan kedua berhasil karena Oracle dapat memetakan 1: 1 masing-masing bar_val ke bar_val di bar. Yang penting adalah foo_id Unik di foo - jadi untuk setiap baris dalam bar, hanya ada paling banyak satu baris yang sesuai di foo ( sebenarnya persis 1 dalam contoh ini, tetapi hal yang sama berlaku untuk kunci asing nullable - intinya adalah bahwa tidak pernah ada lebih dari satu baris).

Biarkan saya memberi contoh dulu dan jelaskan nanti. Pertimbangkan 2 tabel Siswa (t_students) dan Kursus (t_course).

  • Tabel siswa (stundentid, nama, courseid) memiliki kunci utama pada ID siswa.
  • Tabel kursus (courseid, coursename) memiliki kunci utama pada ID kursus.

Ketika dua tabel ini bergabung ->

select * from t_students S, t_course C where S.courseid=C.courseid; 

Data yang dihasilkan akan memiliki jumlah baris yang persis sama dengan tabel Siswa. Tidak akan ada nilai duplikat dari 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:

  • Setiap kunci dalam tabel dasar bertindak sebagai kunci untuk data yang dihasilkan setelah bergabung (studentid)
  • Baris dari baris dasar hanya muncul di data yang dihasilkan paling hanya sekali (Tidak ada baris duplikat)

Ini adalah konsep Key Preserved Tables.

Untuk mengetahui apakah kolom tampilan dapat diperbarui,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

PS: berikan nama tabel/tampilan dalam huruf kapital.

3
Natty