Przeczytałem w Dokumentacji Oracle o tabeli z kluczem w sekcji Aktualizacja widoków dołączania.
Nie znalazłem jednak żadnego prostego sposobu, aby to zrozumieć.
Mam nadzieję, że otrzymam kilka prostych szczegółów koncepcyjnych innych niż oficjalna Dokumentacja Oracle.
Odpowiedzi:
Zachowany klucz oznacza, że 1 wartość klucza trafia do 1 tabeli. Podanie przykładów może pomóc lepiej zrozumieć tę koncepcję.
Przykład 1:
Twój widok zawiera agregację. Załóżmy, że masz następującą strukturę widoku.
W tym przykładzie: twoje wartości pochodzą z więcej niż jednego wiersza. Jeśli spróbujesz zaktualizować AverageSalary w tym widoku, baza danych nie będzie mogła znaleźć TYCH wierszy do zaktualizowania.
Przykład 2: Twój widok pokazuje wartości z więcej niż jednej tabeli. Twój widok pokazuje wartości z tabeli PERSON i PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).
Przykładowe wiersze:
Dołączasz do tabeli 2 i wyświetlasz bardziej przyjazne dla biznesu informacje.
PersonId, Name, LastName, Phone1, Email1
Tutaj chcesz zaktualizować Phone1 i Email1. Ale twój personID odwzorowuje na dwa różne wiersze, w tym przykładzie może być więcej wierszy. W tym widoku ponownie baza danych nie ma możliwości znalezienia KTÓRYCH wierszy do zaktualizowania.
Uwaga: jeśli ograniczysz widok sql i jasno określisz, które wiersze do aktualizacji mogą działać.
Ten dwa przykłady to pierwsze przykłady, które przychodzą mi na myśl. Można je zwiększyć. Ale koncepcja jest jasna. Baza danych musi odwzorować 1 wartość klucza na 1 tabelę. Na przykład masz tabele PERSON jeden do jednego, PERSON_DETAILS. Tutaj widok i aktualizacja będą działać, ponieważ są one jeden do jednego.
źródło
Dokumentacja już czytać mówi całkiem dobrze. Aby wyjaśnić dalej:
Zwykle
update
działa na jednym stole. Aby uniknąć krętych podkwerend w filtrze, Oracle pozwala naupdate
widok (lub podkwerendę), o ile nadal jest w stanie łatwo zmapować dokonane zmiany na rzeczywistych wierszach tabeli. Jest to możliwe, jeśliset
klauzula modyfikuje tylko kolumny w tabeli „z zachowaniem klucza”:Na przykład:
Pierwsza aktualizacja nie powiedzie się, ponieważ Oracle nie ma możliwości mapowanie 1: 1
foo_val
w zapytaniu dofoo_val
wfoo
- odwrotnie druga zmiana powiedzie, ponieważ Oracle może 1: 1 map każdybar_val
dobar_val
wbar
. Ważną rzeczą jest to, żefoo_id
jest unikalny wfoo
- więc dla każdego wiersza wbar
może być tylko jeden odpowiadający wierszfoo
(właściwie dokładnie 1 w tym przykładzie, ale to samo dotyczy dopuszczalnego klucza obcego - chodzi o to, że nigdy nie ma więcej niż jeden rząd).źródło
Najpierw dam przykład i wyjaśnię go później. Rozważ 2 tabele Studenci (t_students) i Kurs (t_course).
Po połączeniu tych dwóch tabel ->
Wynikowe dane będą miały dokładnie taką samą liczbę wierszy jak tabela Studentów. W zestawie wyników nie będzie zduplikowanych wartości studentid (studentid zostanie zachowany). Jednak, chociaż Courseid jest unikalny w tabeli kursów, będzie powtarzany wiele razy w zestawie wyników, ponieważ wielu studentów mogło zdecydować się na ten sam kurs (innymi słowy, Courseid nie jest zachowany).
Na podstawie tego przykładu możesz dojść do wniosku, że:
Jest to koncepcja kluczowych konserwowanych tabel.
Aby wiedzieć, czy kolumny widoku można aktualizować,
PS: podaj nazwę tabeli / widoku dużymi literami.
źródło