Qual è il concetto di Key Preserved Table?


12

Ho letto nella Documentazione Oracle sulla tabella conservata dalle chiavi nella sezione Aggiornamento delle viste di join.

Tuttavia, non ho trovato alcun modo semplice per capirlo.

Spero di ricevere alcuni semplici dettagli concettuali diversi dalla Documentazione Oracle ufficiale.



Ecco un'altra spiegazione che mi ha fatto capire questo concetto complicato: dba.stackexchange.com/questions/38728/…
Vadzim,

Risposte:


7

Chiave conservata significa che 1 valore chiave va a 1 tabella. Fornire esempi contrari può aiutarti a capire meglio questo concetto.

Esempio 1:

La tua vista contiene aggregazione. Supponiamo di avere la seguente struttura di visualizzazione.

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

In questo esempio: i tuoi valori provengono da più di una riga. Se si tenta di aggiornare AverageSalary in questa vista, il database non ha modo di trovare QUALI righe da aggiornare.

Esempio2: la vista mostra i valori di più di una tabella. La tua vista mostra i valori della tabella PERSON e PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).

Righe di esempio:

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

Ti unisci a questa tabella 2 e mostri più informazioni business friendly in vista.

PersonId, Name, LastName, Phone1, Email1

Qui desideri aggiornare Phone1 e Email1. Ma il tuo ID personale viene mappato su due righe diverse, in questo esempio potrebbero esserci più righe. In questa vista, ancora una volta, il database non ha modo di trovare QUALI righe da aggiornare.

Nota: se si restringe la vista sql e si chiarisce che le righe da aggiornare potrebbero funzionare.

Questo due esempio sono i primi esempi che mi vengono in mente. Possono essere aumentati. Ma il concetto è chiaro. Il database deve mappare 1 valore chiave su 1 tabella. Ad esempio, hai uno a uno PERSON, PERSON_DETAILS tabelle. Qui la vista e l'aggiornamento funzioneranno poiché sono uno a uno.


cosa succede se la tabella che si desidera aggiornare contiene una chiave primaria composita?
johny perché il

7

La documentazione che hai già letto lo dice abbastanza bene. Per spiegare ulteriormente:

Il concetto di tabella conservata da chiave è fondamentale per comprendere le restrizioni alla modifica delle viste di join.

Normalmente updateagisce su un unico tavolo. Per evitare subquery tortuose nel filtro, Oracle ti consente di updatevisualizzare (o subquery) purché sia ​​ancora in grado di mappare facilmente le modifiche che stai apportando su righe sottostanti reali in una tabella. Ciò è possibile se la setclausola modifica solo le colonne in una tabella "chiave conservata":

Una tabella viene conservata in chiave se ogni chiave della tabella può anche essere una chiave del risultato del join. Quindi, una tabella conservata con le chiavi ha le sue chiavi conservate attraverso un join.

Per esempio:

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.

il primo aggiornamento fallisce perché Oracle ha alcun modo di mappatura 1: 1 foo_valnella query per foo_valin foo- viceversa il secondo aggiornamento riesce perché Oracle può 1: 1 mapping di ogni bar_vala bar_valin bar. La cosa importante è che foo_idè unica in foo- quindi per ogni riga in bar, ci può essere al massimo una riga corrispondente in foo(in realtà esattamente 1 in questo esempio, ma lo stesso vale per una chiave esterna nullable - il punto è che non c'è mai più di una riga).


3

Vorrei prima fare un esempio e spiegarlo in seguito. Considera 2 tabelle Studenti (t_students) e Corso (t_course).

  • La tabella Studenti (stundentid, nome, courseid) ha una chiave primaria sull'ID studente.
  • La tabella del corso (courseid, coursename) ha una chiave primaria sull'ID del corso.

Quando queste due tabelle vengono unite ->

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

I dati risultanti avranno esattamente lo stesso numero di righe della tabella Studenti. Non ci saranno valori duplicati di studentid nel set di risultati (studentid viene conservato). Tuttavia, sebbene il courseid sia unico nella tabella del corso, verrà ripetuto più volte nel set di risultati, poiché molti studenti potrebbero aver optato per lo stesso corso (in altre parole, courseid non viene conservato).

Con questo esempio, puoi giungere alla conclusione che:

  • Ogni chiave nella tabella di base funge da chiave per i dati risultanti dopo il join (studentid)
  • Le righe della riga di base vengono visualizzate almeno una volta nei dati risultanti (nessuna riga duplicata)

Questo è il concetto di tabelle conservate chiave.

Per sapere se le colonne della vista sono aggiornabili,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

PS: fornire il nome della tabella / vista in lettere maiuscole.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.