Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по SQL.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
960 Кб
Скачать

Удаление данных из таблиц. Команда delete

Для удаления данных из таблиц используется команда DELETE. Команда DELETE предназначена не для того, чтобы удалять значения отдельных столбцов, а для того, чтобы удалять целые записи. Оператор DELETE следует применять с осторожностью — слишком уж безотказно он работает.

Чтобы удалить одну или несколько записей из таблицы, используйте следующий синтаксис оператора DELETE.

DELETE FROM имя_таблицы

[WHERE условие];

Если ключевое слово WHERE в операторе DELETE опущено, будут удалены все строки таблицы. Поэтому практически всегда необходимо использовать ключевое слово WHERE в операторе DELETE.

В качестве примера удалим все сведенья о билетах с датой вылета ранее 1 января 2000 года: lvii

DELETE FROM TICKET

WHERE TC_FL_DATE < '01.01.2000'

При использовании команды DELETE бывает полезно использование вложенных запросов SELECT. Удалим из таблицы PERSON тех людей кто ни разу не летал в качестве пассажира или члена экипажа. Чтобы выполнить это, нужно найти коды личностей всех членов экипажа (из таблицы EQUIPAGE) и всех пассажиров с билетами (из таблицы TICKET). Получаем запрос на удаление: lviii

DELETE FROM PERSON

WHERE NOT PR_CODE IN

(SELECT EQ_PR_CODE FROM EQUIPAGE)

AND NOT PR_CODE IN

(SELECT TC_PR_CODE FROM TICKET)

Здесь используются два вложенных запроса. Первый возвращает коды личностей членов экипажа из таблицы EQUIPAGE, а второй коды личностей из таблицы TICKET. В результате будут удалены все строки из таблицы PERSON коды личностей которых не попадают в результат вывода каждого из этих двух запросов.

Генераторы и их использование

При заполнении таблиц с суррогатным первичным ключом нам приходится вручную проставлять его значение, например - 1, 2, 3..., 10, 20, 30, и т.п. Это в частности, не дает возможности добавить в таблицу несколько строк одной командой INSERT, при помощи конструкции SELECT, как это было показано в предшествующем разделе.

Для решения этой проблемы большинство SQL-серверов имеет специальные механизмы для создания уникальных идентификаторов. В Interbase и Firebird для этого существует механизм генераторов. Генераторы предназначены для получения последовательностей уникальных чисел. (1, 2, 3.. и т.д.). Например, в таблице аэропортов для их нумерации введен столбец AP_CODE, по которому построен первичный ключ. Столбец можно заполнять значениями генератора.

Нужно сразу заметить, что сами по себе генераторы не обеспечивают сохранение последовательности номеров в случае удаления записей - генератор всего лишь выдает числа по очереди увеличивая их на некоторую величину и обеспечивая уникальность выданных значений. То есть, генератор выглядит как переменная типа Integer , которая находится в памяти, и над которой можно выполнять операции Inc и Dec (прибавления и убавления).

Создание генераторов

Генератор - это специальный объект базы данных, который генерирует уникальные последовательные числа. Эти числа могут быть использованы в качестве идентификаторов (например, код аэропорта, код личности и т.п.). Для создания генератора необходимо использовать оператор:

CREATE GENERATOR generatorname;

Как правило, генераторы, предназначаемые для заполнения поля будем называть по имени таблицы с прибавлением вначале строки «GEN_», а в конце «_ID». (Именно такое соглашение по именам использует IBExpert) Например, запрос на создание генератора для таблицы AIRPORT (ключевого поля AP_CODE) будет иметь вид

CREATE GENERATOR GEN_AIRPORT_ID

После создания генератора его значения можно получать при помощи функции

GEN_ID(generatorname, inc_value)

где inc_value - число, на которое необходимо прирастить значение а

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

Генераторы возвращают значения (и сохраняют свои значения на диске) вне контекста транзакции пользователя. Это означает, что если значение генератора было увеличено с 10 до 11 (инкремент 1), то даже при откате транзакции (ROLLBACK) значение генератора, выданное в этой транзакции, не вернется к предыдущему. Вместе с этим гарантируется, что каждому пользователю будет всегда возвращено уникальное значение генератора (вызов функции GEN_ID всегда происходит «монопольно», то есть непараллельно для любого числа одновременных вызовов, чтобы исключить возможность получения разными пользователями одного и того же значения).