Apakah konsep Key Preserved Table?

12

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.

Parmanand
sumber
1
Pernahkah Anda melihat ini di AskTom?
Jack bilang coba topanswers.xyz
Berikut adalah penjelasan lain yang membuat saya memahami konsep rumit ini: dba.stackexchange.com/questions/38728/…
Vadzim

Jawaban:

7

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.

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.

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:

 1,1,email,ddd@example.com
 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.

Atilla Ozgur
sumber
bagaimana jika tabel yang ingin Anda perbarui berisi kunci primer komposit?
Johnny mengapa
7

The dokumentasi Anda telah membaca mengatakan itu cukup baik. Untuk menjelaskan lebih lanjut:

Konsep tabel terpelihara kunci adalah dasar untuk memahami pembatasan memodifikasi pandangan bergabung.

Biasanya suatu updatetindakan di atas satu meja. Untuk menghindari subquery berliku dalam filter, Oracle memungkinkan Anda untuk updatemelihat (atau subquery) selama masih dapat dengan mudah memetakan perubahan yang Anda buat ke baris yang mendasari nyata dalam sebuah tabel. Ini dimungkinkan jika setklausa hanya memodifikasi kolom dalam tabel 'key preserved':

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.

update pertama gagal karena Oracle tidak memiliki cara 1: 1 pemetaan foo_valdi query ke foo_valdalam foo- sebaliknya update kedua berhasil karena Oracle dapat 1: 1 map masing-masing bar_valuntuk bar_valdi bar. Yang penting adalah yang foo_idunik di foo- jadi untuk setiap baris bar, hanya ada paling banyak satu baris yang sesuai di foo(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).

Jack mengatakan coba topanswers.xyz
sumber
3

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 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.

Rapi
sumber