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

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

target:= source;

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

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

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

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АТЕ. Ниже представлен синтаксис этих операций.

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

INSERT source INТO target;

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

Пример:

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

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

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

UPDAТЕ target assignment-commalist;

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

attribute:= scalar-expression

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

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

CITY:= 'Paris';

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

n 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;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: