5.4.3. Обновление представлений
Рассмотренные в гл.4
операции DELETE, INSERT и UPDATE могут оперировать не только базовыми таблицами,
но и представлениями. Однако, если из базовых таблиц можно удалять любые
строки, обновлять значения любых их столбцов и вводить в такие таблицы
новые строки, то этого нельзя сказать о представлениях, не все из которых
являются обновляемыми.
Безусловно обновляемыми являются представления, полученные из единственной
базовой таблицы простым исключением некоторых ее строк и (или) столбцов,
обычно называемые "представление-подмножество строк и столбцов". Таким
является представление Мясные_блюда, полученное из базовой таблицы Блюда
исключением из нее столбца Труд и строк, не содержащих значение 'Мясо'
в столбце Основа. Работая с ним, можно:
-
вставить (операция INSERT) новую строку, например, строку (34, 'Шашлык',
'Г', 150), фактически вставляя соответствующую строку (34, 'Шашлык', 'Г',
150, NULL) в лежащую в основе базовую таблицу Блюда;
-
удалить (операция DELETE) существующую строку из представления, например
строку (13, 'Бастурма', 'Г', 300), фактически удаляя соответствующую строку
(13, 'Бастурма', 'Г', 300, 5) из таблицы Блюда;
-
обновить (операция UPDATE) какое-либо поле в существующей строке, например
увеличить массу порции Бефстроганова с 210 до 250 граммов, фактически осуществляя
то же самое изменение в соответствующем поле таблицы Блюда.
Однако если бы представление Мясные_блюда имело вместо столбца Выход столбец
Вых_труд, полученный путем суммирования значений столбцов Выход и Труд
таблицы Блюда, то указанные выше операции INSERT и UPDATE были бы отвергнуты
системой. Действительно, как распределить вводимое значение столбца Вых_труд
(153 или 254) между значениями столбцов Выход и Труд базовой таблицы Блюда?
Была бы отвергнута и операция удаления масла из состава бастурмы, если
бы ее попытались выполнить путем удаления строки ('Бастурма', 'Масло',
5) в представлении Горячие_мясные_блюда. Встает множество вопросов: надо
ли удалять из базовой таблицы Блюда строку, содержащую значение 'Бастурма'
в столбце Блюдо?; надо ли удалять из базовой таблицы Продукты строку, содержащую
значение 'Масло' в столбце Продукт?; надо ли удалять из базовой таблицы
Состав все строки, содержащие значение 5 в столбце Вес?. Последний вопрос
возник потому, что при конструировании представления Горячие_мяс-ные_блюда
в него не была включена информация о связях между лежащими в его основе
базовыми таблицами Блюда, Состав и Продукты, и у системы нет прямых путей
для поиска той единственной строки таблицы Состав, которая должна быть
удалена.
Таким образом, некоторые представления по своей природе обновляемы,
в то время как другие таковыми не являются. Здесь следует обратить внимание
на слова "по своей природе". Дело заключается не просто в том, что некоторая
СУБД не способна поддерживать определенные обновления, в то время как другие
СУБД могут это делать. Никакая СУБД не может непротиворечивым образом поддерживать
без дополнительной помощи обновление такого представления как Горячие_мясные_блюда.
"Без дополнительной помощи" означает здесь "без помощи какого-либо человека
- пользователя".
Как было указано выше, к теоретически обновляемым представ-лениям относятся
представления-подмножества строк и столбцов. Однако существуют некоторые
представления, которые не являются представлениями-подмножествами строк
и столбцов, но также теоретически обновляемы. Хотя известно, что такие
есть и можно привести их примеры, но невозможно дать их формального определения.
Неверным является такое формальное определение некоторых авторов - "нельзя
обновлять соединение". Во-первых, в некоторых соединениях с успехом выполняется
операция UPDATE, а, во-вторых, как было показано выше, не обновляемы и
некоторые представления, не являющиеся соединениями. Кроме того, не все
СУБД поддерживают обновление любых теоретически обновляемых представлений.
Поэтому пользователь должен сам оценивать возможность использования операций
DELETE, INSERT или UPDATE в созданном им представлении.
5.4.2
| Содержание
| 5.4.4