Программирование >>  Хронологические базы данных 

1 ... 45 46 47 [ 48 ] 49 50 51 ... 348


своения, можно было бы расширить так, чтобы подобные ситуации проверялись. Для простоты эти усовершенствования здесь игнорируются. Разумеется, то же самое касается операторов DELETE и UPDATE.

DELETE S WHERE CITY = Paris; эквивалентно присвоению

S := S MINUS (S WHERE CITY = Paris ) ;

UPDATE S WHERE CITY = Paris

STATUS := 2 * STATUS, CITY := Rome ;

Эквивалент этого оператора, записанный в виде реляционного присвоения, имеет слишком сложный на текущий момент вид, поэтому мы его опускаем (см. [3.3]).

Подводя итог, приведем несколько упрощенный синтаксис операторов INSERT, DELETE и UPDATE.

INSERT INTO <имя nepeMeHHOH-OTHomeHHsi> <реляционное выражениё> ;

DELETE <имя переменной-отношения> [ WHERE <логическое выражение> ] ;

UPDATE <имя переменной-отношения > [ WHERE <логическое выражениё> ]

<список обновляемых атрибутов> ;

Здесь параметр <обновляемый атрибут имеет следующий вид. <имя атрибута> := <выражение>

Синтаксис выражения, помещаемого в параметр <логическое выражениё>, говорит сам за себя, тем не менее он подробно описывается в главе 6.

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

1. В действительности имеется в виду множество кортежей, однако в данном случае кардинальность этого множества равна единице.

2. Иногда обновление множества кортежей с кардинальностью, равной единице, невозможно!

Предположим, например, что на переменную-отношение поставщиков наложено ограничение целостности (подробности приводятся в главе 8), которое заключается в том, что поставщики с номерами S1 и S4 должны иметь один и тот же статус. Тогда при обновлении отдельного кортежа, затрагивающем статус одного из двух перечисленных выше поставщиков, возникнет ошибка. В этом случае необходимо обновлять статус обоих поставщиков одновременно, например так.

UPDATE S WHERE Si = Si ( SI ) OR Si = Si ( S4 ) STATUS := <некоторое значение> ;



Следует подчеркнуть, что говорить об обновлении кортежа (или множества кортежей), как мы это только что делали, - довольно некорректно. Кортежи, как и отношения, являются значениями и не могут быть обновлены (по определению никакое значение изменить нельзя). Таким образом, для того чтобы обновлять кортежи , необходимо ввести понятие переменной кортежа, что вовсе не является частью реляционной модели! Поэтому, когда мы, например, говорим обновление кортежа с его преобразованием в кортеж /2 , подразумевается, что кортеж tx (т.е. значение кортежа t\) заменяется кортежем /2 (под которым снова понимается значение кортежа). Аналогичные замечания относятся к фразам наподобие обновление атрибута Л (некоторого кортежа). В этой книге мы и далее будем говорить обновление кортежей или обновление атрибутов кортежей , поскольку на практике это удобно. Однако не следует забывать, что такие сокращения в общем случае некорректны.

5.5. Средства SQL

К рассматриваемому в этой главе материалу имеют отношение следующие SQL-операторы.

CREATE DOMAIN CREATE TABLE INSERT

ALTER DOMAIN ALTER TABLE UPDATE

DROP DOMAIN DROP TABLE DELETE

Операторы INSERT, UPDATE и DELETE приводились в главе 4. Остальные операторы будут рассмотрены ниже.

Домены

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

CREATE DOMAIN SI CHAR(5) ; CREATE DOMAIN P CHAR(6) ;

CREATE TABLE S ( Si Si, ... ) ; CREATE TABLE P ( Pi Pi, ... ) ; CREATE TABLE SP ( Si Si, Pi Pi, ... ) ;

Далее перечислены некоторые основные различия между настоящими доменами и конструкциями языка SQL.

Как уже отмечалось, на самом деле домены языка SQL - это просто синтаксические сокращения. Они, несомненно, не относятся к истинному типу данных, определяемому пользователем.



Значения доменов языка SQL не могут быть произвольной внутренней сложности . Сложность значений домена ограничена сложностью встроенных типов.

Домены языка SQL должны определяться в терминах одного из встроенных типов, а не в терминах другого домена, определенного пользователем.

На практике каждый домен языка SQL должен определяться в терминах только одного из существующих встроенных типов. Таким образом, в языке SQL невозможно определить домены, аналогичные, например, типам POINT и LINESEG из раздела 5.2.

Домены языка SQL не могут иметь больше одного допустимого представления. В действительности в языке SQL нет четкого различия между типом и его физическим представлением. Например, если домены языка SQL с именами St и Р будут определены в терминах типа CHAR, то над номерами поставщиков и номерами деталей можно будет выполнять те же операщ1И, что и над строками, в частности - конкатенащпо.

В языке SQL нет строгого контроля типов и выполняемая проверка правильности типов соверщенно незначительна. Если взять в качестве примера определенные выше типы St и Pt, следующий SQL-оператор ошибки не вызовет, хотя, если рассуждать логически, должен был бы вызвать.

SELECT *

FROM SP

WHERE St = Pt ;

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

Числа

Строки символов

Строки битов

Даты

Отметки времени

Временные отметки (timestamp)

Интервалы год/месяц

Интервалы день/время

Тогда можно было бы сказать, что проверка правильности типов производится, но только для этих восьми типов. Так, например, попытка сравнить число со строкой битов приведет к ошибке, а сравнение двух чисел будет корректным, даже если эти числа имеют различные представления, скажем, одно - INTEGER, а другое - FLOAT.

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

Ниже приводится пример создания домена с помощью SQL-оператора CREATE DOMAIN.

CREATE DOMAIN <имя домена> <имя встроенного типа> [ <определение значения по умолчании ] [ <ограничениа> ] ;



1 ... 45 46 47 [ 48 ] 49 50 51 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика