|
Программирование >> Хронологические базы данных
своения, можно было бы расширить так, чтобы подобные ситуации проверялись. Для простоты эти усовершенствования здесь игнорируются. Разумеется, то же самое касается операторов 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 <имя домена> <имя встроенного типа> [ <определение значения по умолчании ] [ <ограничениа> ] ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |