Anahtar Korunmuş Tablo kavramı nedir?


12

Oracle Documentation uygulamasında Birleşim Görünümlerini Güncelleme Bölümünde anahtar korunmuş tablo hakkındaki bilgileri okudum.

Ancak, bunu anlamak için basit bir yol bulamadım.

Resmi Oracle Dokümantasyonundan başka bazı basit kavramsal ayrıntılar almayı umuyorum.


1
Bunu AskTom'da gördün mü?
Jack diyor ki topanswers.xyz

İşte bu zor kavramı anlamamı sağlayan başka bir açıklama: dba.stackexchange.com/questions/38728/…
Vadzim

Yanıtlar:


7

Anahtar korunuyor, 1 anahtar değerinin 1 tabloya gittiği anlamına gelir. Karşı örnekler vermek bu kavramı daha iyi anlamanıza yardımcı olabilir.

Örnek 1:

Görünümünüzde toplama var. Aşağıdaki görünüm yapınız olduğunu varsayalım.

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

Bu örnekte: değerleriniz birden fazla satırdan geliyor. AverageSalary'yi bu görünümde güncellemeye çalışırsanız, veritabanının güncellenecek WHICH satırlarını bulmanın bir yolu yoktur.

Örnek2: Görünümünüz birden fazla tablodaki değerleri gösterir. Görünümünüz, PERSON ve PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue) tablosundaki değerleri gösterir.

Örnek satırlar:

 1,1,email,ddd@example.com
 1,1,phone,898-98-99

Bu 2 tabloya katılıp daha fazla iş dostu bilgi görüntülüyorsunuz.

PersonId, Adı, Soyadı, Telefon1, E-posta1

Burada Phone1 ve Email1'i güncellemek istiyorsunuz. Ancak personID'niz iki farklı satıra eşlenir, bu örnekte daha fazla satır olabilir. Bu görünümde yine, veritabanının güncellenecek olan WHICH satırlarını bulmanın bir yolu yoktur.

Not: Görünüm sql'nizi kısıtlarsanız ve hangi satırların güncelleneceğini bulmanızı kolaylaştırabilir.

Bu iki örnek aklıma gelen ilk örneklerdir. Bunlar arttırılabilir. Ancak kavram açıktır. Veritabanı 1 anahtar değerini 1 tabloya eşlemelidir. Örneğin, bire bir PERSON, PERSON_DETAILS tablolarınız var. Burada görünüm ve güncelleme birebir olduğu için çalışacaktır.


güncellemek istediğiniz tabloda bileşik birincil anahtar varsa?
johny neden

7

Daha önce okuduğunuz belgeler oldukça iyi diyor. Daha fazla açıklamak için:

Anahtarla korunan bir tablo kavramı, birleştirme görünümlerini değiştirme konusundaki kısıtlamaları anlamak için esastır.

Normalde updatetek bir masaya etki eder. Filtredeki dolambaçlı alt sorguları önlemek için Oracle, yaptığınız updatedeğişiklikleri bir tablodaki gerçek temel satırlara kolayca eşleştirebildiği sürece bir görünüm (veya alt sorgu) yapmanızı sağlar. Bu, setyan tümce yalnızca bir 'anahtar korunmuş' tablosundaki sütunları değiştirirse mümkündür :

Tablonun her anahtarı birleştirme sonucunun anahtarı da olabiliyorsa, tablo anahtar olarak korunur. Bu nedenle, anahtar korunmuş bir tablonun anahtarları birleştirme yoluyla korunur.

Örneğin:

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.

Oracle 1 bir yol olduğundan ilk güncelleme başarısız: 1 eşleme foo_valsorguda için foo_valde foo- Oracle 1 çünkü tersine ikinci güncelleme başarılı: 1 Her harita bar_valiçin bar_valde bar. Önemli foo_idolan benzersizdir foo- yani her satır için bar, içinde en fazla bir karşılık gelen satır olabilir foo(aslında bu örnekte tam olarak 1'dir, ancak aynısı bir boş anahtar için de geçerlidir - nokta, asla birden fazla satır).


3

Önce bir örnek vereyim ve sonra açıklayayım. 2 tabloyu Öğrenciler (t_students) ve Ders (t_course) olarak düşünün.

  • Öğrenci tablosunda (stundentid, name, courseid) öğrenci kimliğinde birincil anahtar bulunur.
  • Ders tablosunda (courseid, coursename) kurs kimliğinde birincil anahtar vardır.

Bu iki tablo birleştirildiğinde ->

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

Sonuçta elde edilen veriler, Öğrenciler tablosuyla aynı sayıda satıra sahip olacaktır. Sonuç kümesinde yinelenen öğrenci kimliği değerleri olmayacaktır (öğrenci kimliği korunur). Bununla birlikte, Courseid ders tablosunda benzersiz olsa da, birçok öğrenci aynı dersi seçmiş olabileceğinden (başka bir deyişle courseid korunmaz), sonuç kümesinde birden çok kez tekrarlanacaktır.

Bu örnek uygulandığında, şu sonuca varabilirsiniz:

  • Temel tablodaki her Anahtar, birleştirildikten sonra elde edilen verilerin anahtarı olarak işlev görür (studentid)
  • Temel satırdaki satırlar, sonuçta elde edilen verilerde en az bir kez görünür. (Yinelenen satır yok)

Anahtar Korumalı Tablolar kavramı budur.

Görünüm sütunlarının güncellenebilir olup olmadığını bilmek için,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

Not: tablo / görünüm adını CAPITAL harfleriyle girin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.