Я прочитал в документации Oracle о сохраненной на ключе таблице в разделе Обновление представлений соединения.
Тем не менее, я не нашел простой способ понять это.
Я надеюсь получить некоторые простые концептуальные подробности, помимо официальной документации Oracle.
Ответы:
Сохранение ключа означает, что 1 значение ключа попадает в 1 таблицу. Предоставление контрпримеров может помочь вам лучше понять эту концепцию.
Example1:
Ваш вид содержит агрегацию. Предположим, у вас есть следующая структура представления.
В этом примере: ваши значения поступают из нескольких строк. Если вы попытаетесь обновить AverageSalary в этом представлении, база данных не сможет найти, какие строки нужно обновить.
Пример 2: Ваше представление показывает значения из более чем одной таблицы. В вашем представлении отображаются значения из таблицы PERSON и PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue).
Пример строки:
Вы присоединяетесь к этой 2 таблице и показываете больше информации для бизнеса.
PersonId, Имя, Фамилия, Телефон1, Электронная почта1
Здесь вы хотели бы обновить Phone1 и Email1. Но ваш personID отображается в две разные строки, в этом примере может быть больше строк. В этом представлении, опять же, база данных не может найти какие строки для обновления.
Примечание. Если вы ограничиваете свой вид sql и четко указываете, какие строки для обновления могут работать.
Этот два примера - первые примеры, которые приходят мне в голову. Они могут быть увеличены. Но концепция понятна. База данных должна отобразить 1 значение ключа на 1 таблицу. Например, у вас есть таблицы PERSON, PERSON_DETAILS один на один. Здесь просмотр и обновление будут работать, так как это один в один.
источник
Документации вы уже читали это говорит довольно хорошо. Чтобы объяснить дальше:
Обычно
update
действует на одном столе. Чтобы избежать извилистых подзапросов в фильтре, Oracle позволяет вамupdate
просматривать (или подзапрос) представление, пока оно все еще может легко отображать изменения, которые вы вносите, в реальные базовые строки таблицы. Это возможно, если вset
предложении изменяются только столбцы в таблице с сохранением ключа:Например:
первое обновление терпит неудачу , потому что Oracle не имеет возможности 1: 1 отображение
foo_val
в запросе , чтобыfoo_val
вfoo
- наоборот, второе обновление успешно , так как Oracle может 1: 1 сопоставьте каждыйbar_val
наbar_val
вbar
. Важно то, чтоfoo_id
он уникаленfoo
- поэтому для каждой строкиbar
может быть только одна соответствующая строкаfoo
(на самом деле ровно 1 в этом примере, но то же самое относится и к внешнему ключу, допускающему значение NULL) - дело в том, что более одного ряда).источник
Позвольте мне сначала привести пример, а потом объяснить. Рассмотрим 2 таблицы студентов (t_students) и курса (t_course).
Когда эти две таблицы объединены ->
Полученные данные будут иметь ровно столько же строк, сколько и таблица учеников. В наборе результатов не будет повторяющихся значений studentid (studentid сохраняется). Тем не менее, несмотря на то, что идентификатор курса уникален в таблице курсов, он будет повторяться несколько раз в наборе результатов, так как многие студенты могли выбрать один и тот же курс (другими словами, курс не сохраняется).
Используя этот пример, вы можете прийти к выводу, что:
Это концепция ключевых сохраненных таблиц.
Чтобы узнать, являются ли столбцы представления обновляемыми,
PS: укажите название таблицы / представления заглавными буквами.
источник