J'ai lu dans la documentation Oracle sur la table à clé préservée dans la section Mise à jour des vues de jointure.
Cependant, je n'ai trouvé aucun moyen simple de le comprendre.
J'espère recevoir des détails conceptuels simples autres que la documentation officielle d'Oracle.
Réponses:
Clé préservée signifie que 1 valeur de clé va à 1 table. Donner des contre-exemples peut vous aider à mieux comprendre ce concept.
Exemple 1:
Votre vue contient une agrégation. Supposons que vous ayez la structure de vue suivante.
Dans cet exemple: vos valeurs proviennent de plusieurs lignes. Si vous essayez de mettre à jour AverageSalary dans cette vue, la base de données n'a aucun moyen de trouver QUELLES lignes à mettre à jour.
Exemple2: votre vue affiche les valeurs de plusieurs tables. Votre vue affiche les valeurs des tables PERSON et PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).
Exemples de lignes:
Vous rejoignez ce tableau 2 et affichez des informations plus conviviales pour les entreprises.
PersonId, Name, LastName, Phone1, Email1
Ici, vous souhaitez mettre à jour Phone1 et Email1. Mais votre personID est mappé sur deux lignes différentes, peut-être plus de lignes, dans cet exemple. Dans cette vue, encore une fois, la base de données n'a aucun moyen de trouver QUELLES lignes mettre à jour.
Remarque: Si vous limitez votre vue sql et qu'il est clair de trouver les lignes à mettre à jour, cela peut fonctionner.
Ces deux exemples sont des premiers exemples qui me viennent à l'esprit. Ils peuvent être augmentés. Mais le concept est clair. La base de données doit mapper 1 valeur de clé à 1 table. Par exemple, vous avez une à une table PERSON, PERSON_DETAILS. Ici, l'affichage et la mise à jour fonctionneront car ils sont un à un.
la source
La documentation que vous avez déjà lue le dit assez bien. Pour expliquer davantage:
Normalement, un
update
agit sur une seule table. Pour éviter les sous-requêtes tortueuses dans le filtre, Oracle vous permet deupdate
visualiser (ou de sous-interroger) tant qu'il est toujours en mesure de mapper facilement les modifications que vous effectuez sur de vraies lignes sous-jacentes dans une table. Cela est possible si laset
clause ne modifie que les colonnes d'une table 'clé préservée':Par exemple:
la première mise à jour échoue car Oracle ne dispose d'aucun moyen de mappage 1: 1
foo_val
dans la requête versfoo_val
infoo
- à l'inverse, la deuxième mise à jour réussit car Oracle peut mapper 1: 1 chacunbar_val
versbar_val
inbar
. L'important est qu'ilfoo_id
est unique dansfoo
- donc pour chaque lignebar
, il ne peut y avoir au plus qu'une ligne correspondantefoo
(en fait exactement 1 dans cet exemple, mais il en va de même pour une clé étrangère annulable - le fait est qu'il n'y a jamais plusieurs lignes).la source
Permettez-moi de donner un exemple en premier et de l'expliquer plus tard. Considérons 2 tables Etudiants (t_étudiants) et Cours (t_cours).
Lorsque ces deux tables sont jointes ->
Les données résultantes auront exactement le même nombre de lignes que la table Students. Il n'y aura pas de valeurs en double de studentid dans le jeu de résultats (studentid est conservé). Cependant, bien que l'ID de cours soit unique dans la table des cours, il sera répété plusieurs fois dans l'ensemble de résultats, car de nombreux étudiants peuvent avoir opté pour le même cours (en d'autres termes, l'ID de cours n'est pas conservé).
Avec cet exemple en place, vous pouvez conclure que:
C'est le concept des tables conservées clés.
Pour savoir si les colonnes de vue peuvent être mises à jour,
PS: indiquez le nom de la table / vue en lettres MAJUSCULES.
la source