- •ОГЛАВЛЕНИЕ
- •3. Простые варианты поиска данных
- •3.2. Использование ключевого слова DISTINCT
- •3.3. Предложение WHERE
- •4.1. Использование DISTINCT с COUNT
- •4.3. Предложение HAVING
- •5.2. Внешние соединения
- •6. ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ В ОПЕРАТОРАХ SQL
- •6.4. Использование оператора EXISTS
- •6.5. Использование варианта IN с подзапросами
- •6.6. Использование NOT EXISTS
- •8. ДОБАВЛЕНИЕ ДАННЫХ. КОМАНДА INSERT
- •8.1. Добавление отдельной строки
- •9. ОБНОВЛЕНИЕ УЖЕ ИМЕЮЩИХСЯ ДАННЫХ.
- •КОМАНДА UPDATE
- •10. УДАЛЕНИЕ ДАННЫХ ИЗ ТАБЛИЦ. КОМАНДА DELETE
- •11. ГЕНЕРАТОРЫ И ИХ ИСПОЛЬЗОВАНИЕ
- •11.1. Создание генераторов
- •ПРИМЕРЫ ЗАПРОСОВ
DELETE FROM PERSON
WHERE NOT PR_CODE IN
(SELECT EQ_PR_CODE FROM EQUIPAGE)
AND NOT PR_CODE IN
(SELECT TC_PR_CODE FROM TICKETI
Здесь используются два вложенных запроса. Первый возвраща ет коды личностей членов экипажа из таблицы EQUIPAGE, а вто рой - коды личностей из таблицы TICKET. В результате будут уда лены все строки из таблицы PERSON, коды личностей которых не попадают в результат вывода каждого из этих двух запросов.
11. ГЕНЕРАТОРЫ И ИХ ИСПОЛЬЗОВАНИЕ
При заполнении таблиц с суррогатным первичным ключом нам приходится вручную проставлять его значение, например 1, 2, 3, 10, 20, 30 и т.п. Это, в частности, не дает возможности доба вить в таблицу несколько строк одной командой INSERT, при по мощи конструкции SELECT, как это было показано в предшест вующем разделе.
Для решения этой проблемы большинство SQL-серверов имеет специальные механизмы для создания уникальных идентификато ров. В Interbase и Firebird для этого существует механизм генерато ров. Генераторы предназначены для получения последовательно стей уникальных чисел (1,2, 3 и т.д.). Например, в таблице аэропор тов для их нумерации введен столбец AP CODE, по которому построен первичный ключ. Столбец можно заполнять значениями генератора.
Нужно сразу заметить, что сами по себе генераторы не обеспе чивают сохранение последовательности номеров в случае удаления записей - генератор всего лишь выдает числа, по очереди увеличи вая их на некоторую величину и обеспечивая уникальность выдан ных значений, т.е. генератор выглядит как переменная типа Integer, которая находится в памяти и над которой можно выполнять опера ции Inc и Dec (прибавления и убавления).
11.1. Создание генераторов
Генератор - это специальный объект базы данных, который ге нерирует уникальные последовательные числа. Эти числа могут
В этот момент в базе создан новый генератор. Его значение] равно 0. Если вам нужно использовать другое начальное значение] то можно установить (изменить) значение генератора следующей
командой:
SET GENERATOR NEWID 1000
Выполнять данную операцию во время работы пользователь ских приложений можно только в том случае, если новое значение генератора будет заведомо больше текущего. В противном случае приложения могут перестать нормально работать из-за конфликте! новых значений генератора с текущими значениями идентификато
ров.
В общем, установка начального значения генератора о 0 зави сит только от специфических требований приложения.
Увеличение значения генератора
Выше уже было сказано, что функция GEN_ID действует ана логично функции Inc, т.е. увеличивает значение генератора на за данное число. Обычно используют инкремент значения равный I
GEN_ID(NEWID, 1)
Увеличение значения генератора функцией GEN_ID произвол дится в монопольном режиме. Эго означает, что одновременны? вызов GEN_ID(NEWID, I) двумя приложениями вернет каждом^ только свой идентификатор.
Получение значения генератора в приложение
Наиболее распространенным и правильным использование^ генераторов является «получение» нового идентификатора в кли ентское приложение и его последующее использование для тех или иных нужд. Это можно сделать вызовом
SELECT GEN_ID(NEWID, 1) FROM RDB$DATABASE RDB$DATABASE здесь используется как таблица, содержаща:
только одну запись. В результате этим запросом также будет выда на I запись со значением генератора, увеличенным на I. Если нуж но просто получить текущее значение генератора (без его прираще ния), используем вызов:
SELECT GENJD(NEWID, 0) FROM RDB$DATABASE
Триггеры
Триггер - это отдельная хранимая в базе подпрограмма, свя занная с таблицей, которая автоматически включается, когда в таб лицу вставляется (триггер добавления), модифицируется (триггер модификации) или удаляется (триггер удаления) строка. Триггер никогда не вызывается непосредственно. Он выполнятся всякий раз, когда приложение или пользователь пытаются вставлять, модифи цировать или удалять строку в таблице. Другими словами, триггер жестко связан с данными и выполняется тогда и только тогда, когда делается попытка изменить данные.
Триггеры создаются командой CREATE TRIGGER. Синтаксис этой команды следующий:
CREATE TRIGGER name FOR { table
[ACTIVE / INACTIVE;
{BEFORE/AFTER} {DELETE / IN SER T/U PD A ТЕ; [POSITION number;
AS < trigger_body>
< trigger_body> [< variable_declaration_list>} < block>
<variable_declaration_list> ::= DECLARE VARIABLE variable datatype;
[< variable_declarationJist>J
<Ыоск> =
BEGIN
<L_statement>
END
<L_statement>; ;=< compound_statement>/<L_statement>J
< compound_statement> = {< block> /statement;}
Синтаксические конструкции команды CREATE TRIGGER:
Команда |
Описание |
Name |
Имя триггера. Имя должно быть уникальным |
|
в базе данных |
Команда |
Описание |
|
|
table |
Имя таблицы, для которой создается триггер |
||
ACTIVE | INACTIVE |
Необязательная конструкция. Определяет актив |
||
|
ность триггера. ACTIVE - |
триггер |
включен, |
BEFORE | AFTER |
INACTIVE - триггер отключен |
|
|
Обязательный. Определяет, |
когда включается |
||
|
триггер: |
|
|
|
BEFORE - перед операцией, |
выполняемой над |
|
|
таблицей. |
|
|
|
AFTER - после операции, выполняемой над таб |
||
|
лицей |
|
|
DELETE | INSERT | UPDATE |
Указывает, при выполнении какой именно опе |
||
|
рации с таблицей будет включаться триггер: |
||
|
DELETE - удаление, |
|
|
|
INSERT - вставка, |
|
|
|
UPDATE - модификация |
|
|
POSITION number |
Задает порядок, в котором будут выполняться |
||
|
триггеры (с одной таблицей и одними и теми же |
||
|
условиями включения может быть связано не |
||
|
сколько триггеров), number должен быть целым |
||
|
числом между 0 (по умолчанию) |
и 32 767 |
|
|
включительно. Включение триггеров происходит |
||
|
в порядке возрастания номеров (number). Нуме |
||
|
рация может и не быть последовательной. Если |
||
|
триггеры имеют один и тот же номер, то они бу |
||
|
дут включаться в алфавитном порядке их имен |
||
DECLARE VARIABLE |
Объявляет локальные переменные, |
используе |
|
variable datatype; |
мые только в триггере. Объявление каждой пе |
||
|
ременной начинается с ключевых слов |
||
|
DECLARE VARIABLE и заканчивается ;. Имена |
||
|
объявляемых переменных должны быть уни |
||
|
кальными в триггере, datatype задает тип локаль |
||
|
ной переменной |
|
|
<compound_statement> |
Оператор SQL для хранимых процедур и тригге |
||
|
ров. Оператор завершается ;, если это не блок |
||
|
BEGIN-END. После END ; не ставится |
Для нашего случая необходимо еще перед созданием новой за писи найти значение, которое будет присвоено первичному ключу, для этого будет использоваться команда NEW.column, эта команда указывает на значение, которое предполагается присвоить полю базы данных.