|
Программирование >> Построение запросов sql
CREATE TABLE Abonent (AccountCD VARCHAR(6) NOT NULL CONSTRAINT xpka PRIMARY KEY StreetCD INTEGER, HouseNo SMALLINT, FlatNo SMALLINT, Fio VARCHAR(20), Phone VARCHAR(15));. Таким образом, при создании таблицы Abonent определяется ограничение с именем xpka, указывающее в качестве первичного ключа таблицы столбец AccountCD. Для каждого столбца можно назначить условие проверки указанием в ограничении столбца предложения CHECK (<условие проверки>). При этом каждый раз, когда в такой столбец будут добавляться новые или обновляться существующие данные, автоматически будет происходить их проверка в соответствии с <условием проверки>, которое имеет следующий формат: <условие проверки>::= [NOT] <условие проверки1> [[ANDOR][NOT] <условие проверки2>] , <условие проверки>::= {<значение> <операция сравнения> { <значение1> (<скалярный подзапрос>) {ANy ALL} (<подзапрос столбца>)} <значение> [NOT] BETWEEN <значение1> AND <значение2> <значение> [nOT] LIKE шаблон [ESCAPE символ пропуска] <значение> [nOt] CONTAINING <значение1> <значение> [nOt] STARTING [WITH] <значение1> <значение> [nOt] IN (<значение1> [ , <значение2> ] <подзапрос столбца>) <значение> IS [NOT] NULL <значение> IS [nOt] DISTINCT FROM <значение1> EXISTS (<табличный подзапрос>) SINGULAR (<табличный подзапрос>)}, где <значение> { столбец константа <выражение> функция}; <операция сравнения> {= < > <= >= <> }; <табличный подзапрос>::= запрос select, возвращающий набор строк и столбцов; <подзапрос столбца>::= запрос select, возвращающий значения одного столбца, но, возможно, в нескольких строках; <скалярный подзапрос>::= запрос select, возвращающий значение одного столбца в одной строке. По существу, <условие проверки> - это не что иное, как условие поиска предложения WHERE при использовании вложенных запросов. Следует отметить, что если столбец таблицы определен на домене, имеющем ограничение CHECK, то это ограничение не может быть переопределено в определении столбца, хотя столбец может расширить использование ограничения CHECK домена, добавив свои собственные условия. Например, необходимо создать таблицу NachislSumma, определив поле NachislFactCd как первичный ключ на домене PKField. При этом начисленная сумма (поле NachislSum на домене Money) не должна быть меньше 5000, значение поля NachislYear, определяемого на домене TYear с ограничением (VALUE BETWEEN 1990 AND 2100), должно отличаться от 1995. Запрос на создание такой таблицы будет выглядеть следующим образом: CREATE TABLE NachislSumma (NachislFactCD PKField NOT NULL PRIMARY KEY, AccountCD VARCHAR(30) NOT NULL, GazServiceCD PKField NOT NULL, NachislSum Money CHECK (NachislSum >= 5000), NachislMonth TMonth, NachislYear TYear CHECK (NachislYear IS DISTINCT FROM 1995));. Если значения, помещаемые в таблицу NachislSumma, не будут удовлетворять указанным условиям проверки, то возникнет ошибка с SQLCODE=-297. Предложение REFERENCES, указанное в качестве ограничения столбца, задает, что данный столбец таблицы ссылается на родительскую таблицу и является внешним ключом. Если после имени таблицы, на которую ссылается данный внешний ключ, не указаны имена столбцов, то подразумевается, что данный столбец ссылается на первичные ключи. Следует обратить внимание на то, что внешний ключ может ссылаться на первичный ключ той же самой таблицы, т.е. может быть реализовано рекурсивное отношение. Предложения ON DELETE и ON UPDATE используются вместе с REFERENCES при определении внешнего ключа и предназначены для описания типа изменения внешнего ключа при изменении соответствующего ему значения первичного ключа. Т.е. для столбца внешнего ключа таблицы-потомка задаются действия, автоматически выполняемые при удалении или обновлении поля первичного ключа в таблице-родителе, на который ссылается данный внешний ключ. Для указания действий, которые должны выполняться над полем внешнего ключа при удалении и обновлении данных поля первичного ключа, используются следующие параметры: - NO ACTION (используется по умолчанию) означает, что удаление или обновление первичного ключа родительской таблицы не изменяет ссылающийся внешний ключ, вследствие чего попытка операции над родительской таблицей может закончиться неудачей; - CASCADE для ON DELETE удаляет строки, содержащие значение ссылающегося внешнего ключа, а для ON UPDATE обновляет ссылающийся внешний ключ новым значением первичного ключа; - SET DEFAULT устанавливает значение ссылающегося внешнего ключа в заданное для него значение по умолчанию; - SET NULL устанавливает значение ссылающегося внешнего ключа в NULL. Предложения ON DELETE и ON UPDATE могут использоваться одновременно (т. е. для столбца в одном ограничении могут быть указаны действия, которые необходимо выполнить при удалении, а также действия, которые необходимо выполнить при обновлении). Например, необходимо создать таблицу Request, определив поле AccountCD в качестве внешнего ключа, ссылающегося на первичный ключ таблицы Abonent. Необходимо также, чтобы при удалении поля первичного ключа в таблице Abonent удалялись строки с соответствующим значением внешнего ключа в таблице Request. При обновлении первичного ключа в таблице Abonent должно происходить обновление соответствующего внешнего ключа в таблице Request. Следующий запрос создает требуемую таблицу: CREATE TABLE Request (RequestCD INTEGER NOT NULL PRIMARY KEY, AccountCD VARCHAR(6) REFERENCES Abonent(AccountCD) ON DELETE CASCADE ON UPDATE CASCADE, ExecutorCD INTEGER, FailureCD INTEGER, IncomingDate DATE, ExecutionDate DATE, Executed SMALLINT);. 4.2.3. Определение ограничений на таблицу При определении ограничений, накладываемых на всю таблицу, используется следующая синтаксическая конструкция: <тип ограничения>::= CONSTRAINT имя ограничения {{ PRIMARY KEY UNIQUE} (<список столбцов>) FOREIGN KEY (<список столбцов>) REFERENCES родительская таблица [(столбец1 [, столбец2 [ON DELETE {NO ACTION CASCADE SET DEFAULT SET NULL}] ON UPDATE {NO ACTION CASCADE SET DEFAULT SET NULL}] CHECK (<условие проверки>) } [USING [ASC[ENDING] DESC[ENDING]] INDEX имя индекса]. Существует три вида ограничений базовой таблицы: - ограничение первичного ключа;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |