Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Реляционная_алгебра.doc
Скачиваний:
2
Добавлен:
22.11.2019
Размер:
2.61 Mб
Скачать

6.9. Операторы обновления

Реляционная модель (точнее, ее часть, связанная с операторами) кроме реляционной алгебры может включать также операции реляционного присвоения. Несколько примеров таких операций уже приводилось выше в этой главе при обсуждении пошаговой формулировки запроса (некоторые примеры также приводились и в предыдущих главах книги). Вот синтаксис этих операций:

target := source ;

Здесь source и target - реляционные выражения, представляющие совместимые по типу отношения (на практике отношение target называется, как правило, базовым отношением). Вычисленное значение source присваивается отношению target, заменяя его старое значение.

Операция присвоения дает возможность "запоминать" значение некоторых алгебраических выражений в базе данных и таким образом изменять состояние базы данных или, иначе говоря, обновлять базу данных1. Но присвоение --: это несколько грубая операция, потому что она позволяет только полностью заменять значение отношения. На практике, конечно, требуются более точные операции обновления.

Операцию присвоения можно было бы теоретически использовать как основу для таких точных операций. Например, теоретически можно выполнять вставку и удаление кортежей следующим образом:

S := S UNION { { < S# :’S6’ >,

< SNAME :’Baker’ .>,

< STATUS : 50 >,

< CITY : ‘Madrid” > } } ;

SP := SP MINUS { { < S# : ‘S1’ >,

< P# : ‘P1’ >,

<QTY : 300 > } } ;

C помощью первого присвоения в отношение S вставляется кортеж поставщика S6, а с помощью второго - из отношения SP удаляется кортеж поставки детали Р1 по­ставщиком S 1. И если таким способом удалось сымитировать операции INSERT и DELEТE, то, конечно, можно сымитировать и операцюо UPDAТE, сначала удалив, а затем вставив нужный кортеж. (Между прочим, обратите внимание на литералы (обозначения) кортежей и отношений в этом примере. Такие литералы должны под­держиваться любой реальной реляционной системой.)

Однако использование таким способом операций UNION и МINUS вместо явных опе­раций INSERT и DELEТE не вполне удовлетворительно, потому что операции UNION и МINUS не позволяют должным образом обрабатывать ошибки, т.е. они допускают ситуации, которые воспринимаются операциями INSERT и DELEТE как ошибки. В частности, при выполнении операции UNION не пресекается попытка вставки кортежа, дублирующего уже существующий, а при выполнении операции МINUS не отвергается удаление несуществуюшего кортежа. Поэтому на практике в реляционных системах существуют явные операции INSERT, DELEТE и UPDАТЕ. Ниже представлен синтаксис этих операций.

  • INSERT. Оператор вставки имеет следующий вид:

INSERT source INТO target ;

Здесь source и target - это реляционные выражения, представляющие совмести­мые по типу отношения (на практике отношение target является просто именован­ным отношением). Значение отношения source вычисляется, и все кортежи резуль­тата вставляются в отношение target.

Пример:

INSERT ( S WНERE CIТY = 'London' ) INТO ТЕМР ;

Здесь, отношение ТЕМР совместимо по типу с отношением S.

  • UPDAТЕ. Оператор обновления имеет следующий вид:

UPDAТЕ target assignment-commalist;

Каждое присвоение (assignment) имеет форму

attribute := scalar-expression

Здесь target - реляционное выражение, а каждый атрибут attribиte принадлежит отношению, которое является результатом вычисления указанного выражения. Все кортежи в результирующем отношении обновляются в соответствии с указан­ными операторами присвоения. Например:

UPDAТЕ Р WНERE COLOR = 'Red'

CITY := 'Paris' ;

На практике выражение target часто будет просто ограничивающим условием для некоторого именованного отношения, как в предложенном примере.

  • DELETE. Оператор удаления имеет следующий вид:

DELEТE target ;

Здесь target- реляционное выражение; все кортежи в результирующем отноше­нии удаляются. Например:

DELEТE S WНERE STAТUS < 20 ;

Как и в случае с оператором обновления, выражение target часто будет просто ог­раничивающим условием для некоторого именованного отношения, как в предло­женном примере.

В дальнейшем изложении еще будут обсуждаться ситуации, когда выражение target сложнее, чем в приведенных примерах (это касается операций INSERT, DELEТE И UPDAТE И реляционных выражений вообще). Обратите особое внимание на то, что эти операции действуют на уровне множеств. Например, с помощью операции DELEТE удаляется множество кортежей из целевого отношения.

К сожалению, мы часто говорим, например, об обновлении отдельного кортежа в отношении, но нужно ясно представлять, что:

1) на самом деле речь идет об обновлении множества кортежей в отношении (просто множество в данном случае имеет кардинальное число, равное единице);

2) иногда обновление множества кортежей с кардинальным числом один невоз­можно!

Предположим, например, что отношение поставщиков имеет целостное ограниче­ние, в соответствии с которым поставщики S1 и S4 должны иметь одинаковый статус. Тогда любое обновление "на уровне кортежа" при попытке изменить статус одного из этих кортежей будет отвергнуто. Обновление обоих кортежей должно быть выполне­но одновременно, как в следующем примере:

UPDAТE S WНERE S# = 'S1' OR S# = 'S4'

SТAТUS := SТAТU5 + 5 ;

Замечание о значении отношений

Как отмечалось в главе 4, каждое отношение имеет ассоциируемое с ним значение или предикат, и пользователи должны обращать внимание на эти предикаты, чтобы правильно использовать базу данных. Заметьте, что сказанное относится как к выборке данных, так и к их обновлению. Однако вопрос возникает прежде всего в связи с обнов­лением, поскольку, как объяснялось в главе 4, предикат - это критерий допустимости обновления для данного отношения, с помощью которого можно установить, например, будет ли корректной определенная операция обновления (как вы действительно убедились при обсуждении операций обновления в приведенном выше примере).

Предикаты для базовых отношений предполагаются известными - они содержат, главным образом, всякие ограничения целостности (например, ограничения потенци­альных ключей, внешних ключей и, возможно, другие ограничения), предъявляемые к данному отношению. Ну а как же насчет производных отношений? Для этого, оче­видно, нам нужен такой набор правил, которые позволяют установить предикат для результата произвольной реляционной операции, если известен предикат или преди­каты для входных данных этой операции.

На самом деле очень просто определить такой набор правил - они непосредст­венно следуют из определений операций. Например, если А и В - два произвольных совместимых по типу отношения, а их соответствующие предикаты- РА и РВ, то предикат РС для выражения (назовем его С) А INTERSECT В будет, очевидно, (PA) AND (PB); т.е. кортеж t будет принадлежать С, если и только если PA(t) - истина и РВ(t) - истина. Так, например, если мы определяем С как представление и пыта­емся вставить кортеж t в это представление, то кортеж t должен удовлетворять преди­кату

для А и предикату для В, иначе операция вставки не будет выполнена. (далее в этой книге мы еще вернемся к обсуждению обновлений представлений.)

Вот еще один пример: предикат для отношения, являющегося результатом операции выборки

R WНERE condition

будет такой: (PR) AND (condition), где PR - предикат для отношения R.

Формулировку предикатов, отвечающих другим операторам реляционной алгебры, оставляем в качестве упражнения для пользователя.