it-swarm.it

Qual è il concetto di Key Preserved Table?

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.

12
parmanand

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 tua 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,[email protected]
 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.

7
Atilla Ozgur

Il 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 un update agisce su una singola tabella. Per evitare subquery tortuose nel filtro, Oracle ti consente di update una vista (o subquery) purché sia ​​ancora in grado di mappare facilmente le modifiche che stai apportando su righe sottostanti reali in una tabella. Questo è possibile se la clausola set 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 non ha modo di mappare 1: 1 foo_val nella query a foo_val in foo - al contrario, il secondo aggiornamento ha esito positivo poiché Oracle può mappare 1: 1 ciascuno bar_val per bar_val in bar. L'importante è che foo_id è univoco 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).

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

3
Natty