Скачиваний:
180
Добавлен:
02.05.2014
Размер:
2.66 Mб
Скачать

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 Pi CHAR(6) ;

CREATE TABLE S ( SI St, ... ) ; CREATE TABLE P ( PI Pt, ... ) ; CREATE TABLE SP ( Si Si, Pi Pi, ... ) ;

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

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

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

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

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

  • Домены языка SQL не могут иметь больше одного "допустимого" представления. В действительности в языке SQL нет четкого различия между типом и его физическим представлением. Например, если домены языка SQL с именами Si и Pi будут опреде- лены в терминах типа CHAR, то над номерами поставщиков и номерами деталей можно будет выполнять те же операции, что и над строками, в частности — конкатенацию.

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

SELECT * FROM SP WHERE Si = Pi ;

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

  • Числа

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

  • Строки битов

  • Даты

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

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

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

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

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

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

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

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

Пояснения

  1. Список допустимых имен встроенных типов, которые можно указывать как значе- ние параметра <ныя встроенного тнпа>, приводится в разделе 4.2 главы 4.

  2. Необязательный параметр определения значения по умолчанию задает значение по умолчанию, которое будет применяться к каждому столбцу, определенному на этом домене и не имеющему собственного явного заданного значения по умолча- нию (подробности приводятся в следующем разделе). Значение этого параметра должно иметь вид DEFAULT Оначение по умолчании», где параметр Оначение по умопчанию>, в свою очередь, может быть литералом, именем встроенного 0- адического оператора или ключевым словом NULL12.

Замечание, Оператор, который не имеет операндов, называется 0-адическим (например, CURRENT_DATE).

3. В необязательном параметре <ограничения> перечисляются все ограничения, при- меняемые к определяемому домену. Обсуждение ограничений мы откладываем до главы 8.

Существующий SQL-домен можно в любое время изменить с помощью оператора ALTER DOMAIN. В частности, этот оператор позволяет определить для указанного домена новое значение по умолчанию (заменяя при этом старое значение, если оно было указано) или удалить существующее. Он также позволяет ввести новое ограничение це- лостности для данного домена или удалить уже существующие ограничения. Подробное изложение всех этих опций (а они довольно сложны) выходит за рамки данной книги. Интересующийся читатель может обратиться к [4.19].

И наконец, существующий домен можно отменить с помощью оператора DROP DOMAIN, имеющего следующий синтаксис.

DROP DOMAIN <имя доыена> <режим> ;

Здесь параметр <режим> может принимать значения RESTRICT и CASCADE. Общая идея состоит в следующем.

  • При выборе опции RESTRICT домен не будет уничтожен, если на него имеются ка- кие-либо ссылки.

  • При выборе опции CASCADE операция будет выполнена и "каскадно" продолжена во всех направлениях. Столбцы, которые были ранее определены на основе уда- ляемого домена, будут рассматриваться как определенные непосредственно на ба- зе типа данных этого домена.

12 Подробное обсуждение поддержки в языке SQL пустых значений (обозначаемых ключевым словом NULL) мы отложим до главы 18. Однако отдельных упоминаний о пустых значениях в этой главе не избежать.

Механизм такой операции достаточно сложен, и поэтому подробности опускаются. Дополнительные сведения можно найти в [4.19].

Базовые таблицы

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

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

  • Во-вторых, в таблицах языка SQL, в отличие от настоящих отношений, столбцы рассматриваются в порядке слева направо. Например в таблице поставщиков S столбец St может быть первым столбцом, столбец SNAME — вторым и т.д.

Перейдем непосредственно к базовым таблицам. Они определяются с помощью опе- ратора CREATE TABLE (обратите внимание, что ключевое слово TABLE означает здесь ис- ключительно базовую таблицу; то же самое касается операторов ALTER TABLE и DROP TABLE, которые описываются ниже). Синтаксис выражения следующий.

CREATE TABLE <имя базовойтабпицы>

( <списох элементов базовой таблицы> );

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

<имя столбца> <тнп или имя домена> [ <значение по умолчании» ]

Здесь параметр <имя столбца> указывает название столбца, параметр <тип или имя домена> задает используемый тип данных или домен, а необязательный параметр <значение по умолчанию> устанавливает значение по умолчанию для описываемого столбца, которое подавляет значение по умолчанию, указанное на уровне домена (если такое имеется).

Замечание. Параметр Оначение по умогчанию> задает значение по умолчанию, ко- торое помещается в соответствующий столбец в том случае, если пользователь не указал конкретное значение для этого столбца в операторе INSERT. Подобный случай проиллю- стрирован в разделе 4.6 главы 4. Если для данного столбца собственное значение по умолчанию явно не определено, а также если нет такового значения, наследуемого из домена, то предполагается, что значение по умолчанию— NULL, т.е. NULL— это "значение по умолчанию, используемое по умолчанию".

Пример использования оператора CREATE TABLE показан на рис. 4.1 главы 4.

Существующее определение базовой таблицы можно в любое время изменить с по- мощью оператора ALTER TABLE. Он позволяет выполнить следующие изменения.

  • Добавить столбец

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

  • Удалить значение по умолчанию для существующего столбца

  • Удалить существующий столбец

  • Задать новые ограничения целостности

  • Удалить существующие ограничения целостности

Приведем пример для первого случая.

ALTER TABLE S ADD COLUMN DISCOUNT INTEGER DEFAULT -1 ;

Этот оператор добавляет в базовую таблицу поставщиков столбец с именем DISCOUNT (имеющий тип INTEGER). Начальным значением каждой строки этого столбца во всех случаях будет -1.

Наконец, существующую базовую таблицу можно уничтожить с помощью оператора DROP TABLE.

DROP TABLE <иня базовой таблицы> <режим> ;

Здесь (как и в случае оператора DROP DOMAIN) опция <режим> принимает одно из двух возможных значений — RESTRICT или CASCADE. При выборе опции RESTRICT базовая таб- лица не будет уничтожена, если на нее имеются ссылки в каком-либо представлении или ограничении целостности. При выборе опции CASCADE операция будет выполнена (будут удалены все строки таблицы, а затем и сама таблица), при этом1 также будут удалены все представления и ограничения целостности, ссылающиеся на эту таблицу.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]