Що таке ключова концепція збереженої таблиці?


12

Я читав у Документації Oracle про збережену ключі таблиці в розділі Оновлення приєднань.

Однак я не знайшов простого способу зрозуміти це.

Я сподіваюся отримати деякі прості концептуальні деталі, окрім офіційної Документації Oracle.



Ось ще одне пояснення, яке змусило мене зрозуміти цю хитру концепцію: dba.stackexchange.com/questions/38728/…
Вадим

Відповіді:


7

Ключове збережене означає, що 1 ключове значення переходить до 1 таблиці. Наведення зустрічних прикладів може допомогти вам зрозуміти цю концепцію краще.

Приклад1:

Ваш погляд містить агрегацію. Припустимо, у вас є така структура перегляду.

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

У цьому прикладі: ваші значення походять з кількох рядків. Якщо ви спробуєте оновити AverageSalary у цьому поданні, у базі даних немає способу знайти, ЯКІ рядки для оновлення.

Приклад2: У вашому представленні відображаються значення більш ніж однієї таблиці. У вашому представленні відображаються значення таблиці PERSON та PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).

Приклад рядків:

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

Ви приєднуєтесь до цієї 2 таблиці та показуєте більше зручної для бізнесу інформації.

PersonId, Ім'я, Прізвище, Телефон1, Email1

Тут ви хочете оновити Phone1 та Email1. Але ваш personID відображає два різних рядки, у цьому прикладі може бути більше рядків. Згідно з цим, знову ж таки, у базі даних немає способу знайти, ЯКІ ряди для оновлення.

Примітка. Якщо ви обмежуєте перегляд sql і даєте зрозуміти, які рядки для оновлення можуть працювати.

Цей два приклади - це перші приклади, які мені спадають на думку. Їх можна збільшити. Але концепція зрозуміла. Базі даних потрібно зіставити 1 ключове значення на 1 таблицю. Наприклад, у вас є одна до однієї таблиці PERSON, PERSON_DETAILS. Тут перегляд та оновлення працюватимуть, оскільки це одне до одного.


що робити, якщо таблиця, яку ви хочете оновити, містить складений первинний ключ?
johny чому

7

Документації ви вже читали це говорить досить добре. Щоб пояснити далі:

Поняття таблиці, що зберігається ключем, є основоположною для розуміння обмежень щодо зміни переглядів об'єднання.

Зазвичай це updateакти на одній таблиці. Щоб уникнути обертових підзапитів у фільтрі, Oracle дозволяє вам updateпереглядати (або підзапрос), якщо він все ще може легко відображати зміни, які ви вносите, до реальних підрядних рядків таблиці. Це можливо, якщо setпункт лише змінює стовпці таблиці "збережений ключ":

Таблиця зберігається в ключах, якщо кожен ключ таблиці також може бути ключем результату з'єднання. Отже, у таблиці, що зберігається, є свої ключі, збережені через з'єднання.

Наприклад:

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: 1 відображення foo_valв запиті , щоб foo_valв foo- навпаки, друге оновлення успішно , так як Oracle може 1: 1 зіставте кожен bar_valна bar_valв bar. Важливим є те, що foo_idвін унікальний foo- тому для кожного рядка в barможе бути лише максимум один відповідний рядок у foo(насправді рівно 1 в цьому прикладі, але те саме стосується нульового зовнішнього ключа - справа в тому, що ніколи не існує більше одного ряду).


3

Дозвольте спочатку навести приклад та пояснити його згодом. Розглянемо 2 таблиці Студенти (t_students) та Курс (t_course).

  • Таблиця студентів (stundentid, ім'я, курс) має первинний ключ на ідентифікаційний номер студента.
  • Таблиця курсу (courseid, ім'я курсу) має первинний ключ на ідентифікатор курсу.

Коли ці дві таблиці з'єднані ->

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

Отримані дані матимуть рівно стільки ж рядків, скільки і таблиця студентів. У наборі результатів не буде повторюваних значень studentid (studentid зберігається). Однак, хоча курсид є унікальним у таблиці курсу, він буде повторюватися кілька разів у наборі результатів, оскільки багато студентів, можливо, обрали один і той же курс (іншими словами, курсід не збережений).

За допомогою цього прикладу ви можете дійти висновку, що:

  • Кожен ключ у базовій таблиці виконує роль ключа до результатів, що виникають після приєднання (studentid)
  • Рядки з базового рядка відображаються в отриманих даних принаймні лише один раз (без повторних рядків)

Це концепція ключових збережених таблиць.

Щоб знати, чи можна оновити стовпці перегляду,

select * from all_updatable_columns where table_name='V_VIEW_NAME';

PS: введіть назву таблиці / перегляду літерами CAPITAL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.