Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы Данных - Сибилев, 2007

.pdf
Скачиваний:
290
Добавлен:
11.05.2015
Размер:
1.93 Mб
Скачать

221

DELETE FROM TQt;

Будут удалены все строки временной таблицы TQt.

Пример 8. Удалить сведения о поставках, выполненных поставщи-

ками из Лесото.

DELETE FROM SPJ

WHERE Snum IN (

SELECT Snum

FROM S

WHERE Ci = ‘Лесото

);

7.3 Язык определения данных (DDL)

7.3.1 Назначение и структура операторов DDL

Концептуально операторы DDL являются декларациями. Принимая такую декларацию, система порождает группу SQL-операторов обновле-

ния таблиц системного каталога.

Операторы DDL можно разделить на три категории:

CREATE – определение (создание) объекта;

DROP – уничтожение существующего объекта;

ALTER – изменение определения существующего объекта.

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

Каждый оператор категории CREATE создаёт объект схемы.

CREATE тип_объекта имя определение;

тип_объекта ::= ASSERTION

| CARACTER SET

| COLLATION

| DOMAIN

| SCHEMA

222

| TABLE

| TRANSLATION

| VIEW

имя – это уникальный идентификатор объекта. Полное имя имеет вид кластер.каталог.схема.объект. Если префиксы не указаны, то система относит создаваемый объект к текущей схеме. Имя объекта должно быть уникальным в схеме.

определение описание структуры и свойств объекта.

Любой оператор этой категории порождает группу SQL-операторов вставки строк в таблицы системного каталога.

Объект, созданный оператором CREATE, может быть уничтожен оператором

DROP тип_объекта имя [дополнительные _опции];

Оператор этой категории порождает группу SQL-операторов удале-

ния строк из таблиц системного каталога.

Определение домена или таблицы, созданное оператором CREATE,

может быть изменено оператором

ALTER тип_объекта имя изменение_определения;

тип_объекта ::= DOMAIN

| TABLE

изменение_определения ::= SET_опция

| ADD_опция

| DROP_опция

Один оператор ALTER вносит только одно изменение в определе-

ние объекта. Опции оператора ALTER определяют действия, изменяющие свойства объекта. В общем случае оператор категории ALTER порождает группу SQL-операторов обновления таблиц системного каталога.

Ниже в настоящем подразделе рассмотрены только операторы DDL

для работы с доменами, таблицами, утверждениями, представлениями и схемами.

223

7.3.2 Оператор определения домена

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

CREATE DOMAIN имя_домена [AS] тип_данных

[ DEFAULT значение_по_умолчанию ]

[ определение_ограничения];

тип_данных ::= имя_встроенного_типа_данных [(длина)]

| имя_домена

значение_по_умолчанию значение, которое будет присвоено при обновлении определенному на домене столбцу, если новое значение не указано явно.

определение_ограничения ::=

[имя_ограничения]

CHECK (предикат)

[

[ [ NOT ] DEFERRABLE ]

[

{ INITIALLY IMMEDIATE } | { INITIALLY DEFERRED }

]

]

где предикат – любой допустимый предикат SQL (см. п. 7.2.6).

Всякое ограничение рассматривается системой как объект схемы.

Поэтому оно должно иметь уникальное имя. Полное имя составляется из имени кластера, имени каталога, имени схемы и уникального имени в схе-

ме. Если имя ограничения не указано явно, то система относит его к теку-

щей схеме и назначает имя в схеме по умолчанию.

Сам домен как множество значений никогда не обновляется, поэтому ограничение домена никогда не проверяется само по себе. Проверка вы-

полняется при обновлении любого столбца, ссылающегося на домен. Пре-

224

дикат обязательно содержит ключевое слово VALUE, которое исполняю-

щий механизм системы заменит ссылкой на обновляемый столбец при вы-

полнении проверки. Предикат может содержать также ссылки на любые столбцы таблиц, кроме тех, которые прямо или косвенно ссылаются на оп-

ределяемый домен.

Дополнительные параметры определяют режим проверки ограниче-

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

затрагивающего определенный на домене столбец. Если указан параметр

DEFERRABLE, то проверка может быть отложена до окончания транзак-

ции. Для этого нужно указать INITIALLY DEFERRED. Если ограничение помечено как откладываемое (DEFERRABLE), то режим его проверки может быть изменён в сеансе работы сколько угодно раз с помощью спе-

циального оператора, устанавливающего текущий режим проверки огра-

ничений.

Примеры.

CREATE DOMAIN CITY AS CHAR(15);

Это предложение определяет домен символьных строк длиной до 15

символов. Домен может использоваться как тип данных для столбцов S.Ci, P.Ci и J.Ci.

CREATE DOMAIN Weight REAL

CHECK (VALUE > 5.9 AND VALUE < 12.5);

Домен Weight содержит только вещественные значения в интервале

(5.9, 12.5).

CREATE DOMAIN Pnum CHAR(4)

CHECK (VALUE LIKE ‘P_ _ _’);

Определён домен символьных строк длиной 4 символа. Допустимое значение должно содержать символ ‘P’ и три произвольных символа. Ог-

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

28 Сравните его с [2, п. 2.4.1].

225

CREATE DOMAIN SPJPnum CHAR

CHECK (VALUE IN (SELECT Pnum FROM P));

Это предложение определяет домен SPJPnum, содержащий все зна-

чения столбца Pnum из существующей в момент проверки ограничения таблицы P.

7.3.3 Оператор уничтожения домена

DROP DOMAIN имя_домена CASCADE | RESTRICT;

Ключевое слово RESTRICT указывает, что оператор не должен ис-

полняться, если в определениях столбцов схемы имеются ссылки на унич-

тожаемый домен. Ключевое слово CASCADE указывает, что перед удале-

нием домена система должна выполнить один или более операторов

ALTER TABLE для каждой таблицы, содержащей хотя бы один столбец,

ссылающийся на удаляемый домен. После выполнения этих операторов столбец получит тип данных удаляемого домена, его значение по умолча-

нию, если оно не было определено для столбца явно, и все ограничения домена.

7.3.4 Оператор изменения домена

ALTER DOMAIN имя_домена

{ SET DEFAULT значение_по_умолчанию } | { DROP DEFAULT}

| { ADD определение_ограничения }

| {DROP CONSTRAINT имя_ограничения };

Параметр SET DEFAULT определяет для домена значение по умол-

чанию, если оно не было задано при создании домена. Это значение будет использоваться для каждого столбца, определенного на домене29. DROP DEFAULT отменяет ранее установленное значение по умолчанию. ADD

накладывает новое ограничение на домен, а DROP CONSTRAINT отме-

няет указанное именем ограничение. Если имя ограничения не было задано

29 За исключением тех, для которых значение по умолчанию определено явно.

226

в определении домена, то назначенное системой имя можно получить из информационной схемы.

Пример.

ALTER DOMAIN Weight SET DEFAULT 6.0;

Для домена Weight (см. примеры в п. 7.3.2) устанавливается значение по умолчанию 5.0.

7.3.5 Оператор определения таблицы

Стандарт SQL2 предусматривает возможность определения постоян-

ных и созданных временных базовых таблиц посредством следующего оператора:

CREATE [{ GLOBAL | LOCAL } TEMPORARY ] TABLE

имя_таблицы

(

{

определение_столбца

| [ограничение_таблицы]

}.,..

[ ON COMMIT { DELETE | PRESERVE } ROWS ]

);

Если указан параметр TEMPORARY, то создаваемая таблица является временной и для неё следует указать дополнительно GLOBAL

или LOCAL.

Предложение ON COMMIT используется только для временных таблиц. Оно определяет действия системы при успешном завершении транзакции. Если указано PRESERVE, то данные таблицы сохраняются для следующей транзакции. DELETE означает, что строки таблицы должны быть удалены. По умолчанию используется DELETE. Если транзакция завершается откатом, то таблица возвращается к состоянию на конец предыдущей транзакции.

227

Определение столбца подобно определению домена.

определение_столбца ::=

имя_столбца { имя_домена | тип_данных [ (длина) ]}

[ограничение_столбца]

[ DEFAULT значение_по_умолчанию ] [ COLLATE имя_сравнения ]

Имя столбца должно быть уникальным в пределах таблицы. Тип данных и длина определяются смыслом данных. Для столбца типа

CHARACTER STRING можно задать последовательность сортировки предложением COLLATE. Если столбец ссылается на домен, для которо-

го задано значение по умолчанию и/или последовательность сортировки,

то предложения DEFAULT и COLLATE в определении таблицы переоп-

ределяют их для столбца.

Пример 1. Простейшее определение таблицы может иметь вид:

CREATE TABLE P

( Pnum Pnum,

Pnam CHAR(15),

We NUMERIC,

Co CHAR(10),

Ci City

);

Здесь определена таблица P из «учебной» базы данных «Поставщик

– Деталь – Изделие». Столбцы Pnum и Ci принимают значения на доменах

Pnum и City соответственно (см. примеры в п. 7.3.2). Недостаток этого (до-

пустимого в SQL) определения в том, что таблица не имеет первичного ключа. Это означает, что система не сможет поддерживать требование це-

лостности сущности. Она не создаст (автоматически) индекс для столбца

Pnum, имеющего смысл первичного ключа.

228

Ограничение столбца используется для указания простого первич-

ного ключа и других необходимых ограничений на значения столбца таб-

лицы. Синтаксис ограничения следующий:

ограничение_столбца ::=

[ CONSTRAINT определение_имени_ограничения ]

NOT NULL

| PRIMARY KEY

| UNIQUE

| CHECK (предикат)

| { REFERENCES имя_таблицы

[(имя_столбца) ] [ссылоч-

ная_спецификация] } [[ NOT ] DEFERRABLE ]

[{ INITIALLY IMMEDIATE } | { INITIALLY DEFERRED }]

Ограничение столбца подобно ограничению домена. Рассмотрим здесь только предложения, не упоминавшиеся выше (см. таблица 5.4).

Таблица 5.4 Спецификации ограничений столбца

Предложение Смысл

NOT NULL

Столбец не содержит неопределенных значений.

 

 

PRIMARY KEY

Столбец является первичным ключом.

 

 

UNIQUE

Столбец не содержит повторяющихся значений.

REFERENCES Значения столбца являются ссылками.

Предложения PRIMARY KEY и UNIQUE описывают соответствен-

но простые первичные и альтернативные ключи. Ограничение PRIMARY KEY означает, что все значения столбца должны быть различны и среди них не может быть NULL-значений. Для конкретной таблицы может су-

ществовать единственное ограничение PRIMARY KEY. В отличие от это-

го, ограничение UNIQUE допускает NULL-значения столбца и может встретиться в определении таблицы несколько раз.

229

Предложение REFERENCES определяет имя родительской (ссы-

лочной) таблицы, на которую ссылается специфицируемый столбец. Ссы-

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

дителя, имеющий ограничение PRIMARY KEY или UNIQUE. Если спе-

цифицируемый столбец ссылается на альтернативный ключ родителя, то следует указать имя столбца родительской таблицы, на который ведёт ссылка.

Замечание. Это еще одно отличие SQL2 от реляционной модели данных. Предыдущий стандарт требовал только соответствия типов и длин ссылочных и ссылающихся столбцов.

Ссылочная спецификация описывает правила ссылочной целостно-

сти.

ссылочная_спецификация ::= [ ON UPDATE { CASCADE

| SET NULL

| SET DEFAULT

| NO ACTION }]

[ ON DELETE { CASCADE

| SET NULL

| SET DEFAULT

| NO ACTION }]

Предложения ON UPDATE и ON DELETE содержат инструкции,

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

Если используется инструкция CASCADE, то значения ссылающе-

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

тельского ключа, будут соответственно обновлены (удалены).

Инструкция SET NULL требует замещения значений ссылающегося столбца, совпадающих с обновляемым (удаляемым) значением родитель-

230

ского ключа, значениями NULL, а инструкция SET DEFAULT – значе-

ниями по умолчанию.

Правило NO ACTION означает, что автоматическое изменение зна-

чений внешнего ключа выполняться не будет. Если обновление/удаление значения родительского ключа влечет нарушение ссылочной целостности,

то обновляющая операция будет отвергнута.

Некоторые коммерческие продукты допускают определение нестан-

дартных правил ссылочной целостности и связывание их с таблицами в операторах CREATE TABLE.

Пример 2. Используя ограничения столбца можно создать более ос-

мысленное определение таблицы P (см. пример 1):

CREATE TABLE P

( Pnum Pnum PRIMARY KEY,

Pnam CHAR(15) NOT NULL,

We NUMERIC CHECK(We BETWEEN 50 AND 3000),

Co CHAR(10),

Ci City

);

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

ниями атрибута Pnum, или с неопределенными значениями поля Pn, или со значениями We < 50 или We > 3000.

Ограничение таблицы подобно ограничению столбца, но распро-

страняется на подмножество столбцов. Синтаксис ограничения таблицы является очевидным расширением синтаксиса определения столбца.

ограничение_таблицы ::=

[ CONSTRAINT определение_имени_ограничения ]

{ PRIMARY KEY (имя_столбца.,..) }

| { UNIQUE (имя_столбца.,..) }

|CHECK (предикат)