Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции2011.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.86 Mб
Скачать

Многострочный оператор insert

Многострочный оператор insert, синтаксическая диаграмма которого изображена на рис. 2.2, добавляет в целевую таблицу несколько строк (более одной). В этой разновидности оператора insert значения данных для новых строк явно не задаются. Источником новых строк служит запрос на чтение, содержащийся внутри оператора INSERT.

Рисунок 2.2 - Синтаксическая диаграмма многострочного оператора INSERT

Предположим, требуется скопировать номера, даты и стоимости всех заказов, сделанных до 1 января 1990 года, из таблицы orders в другую таблицу с именем oldorders. Многострочный оператор insert позволяет скопировать данные компактно и быстро:

Скопировать старые заказы в таблицу oldorders.

INSERT INTO OLOORDERS (ORDERJIUM, ORDER_DATE, AMOUNT) SELECT ORDER_NOM,ORDER_DATE, AMOUNT

FROM ORDERS WHERE ORDERJ3ATE < '01-JAN-90'

Хотя многострочный оператор insert выглядит сложнее однострочного, в действительности он является очень простым. В нем, как и в однострочном операторе insert, задаются таблица и столбцы, в которые заносятся новые элементы данных. Оставшаяся часть оператора представляет собой запрос, считывающий данные из таблицы orders. Сначала выполняется запрос к таблице orders, а затем таблица результатов этого запроса построчно добавляется в таблицу oldorders.

На запрос, содержащийся внутри многострочного оператора insert, стандарт SQL1 накладывает несколько логических ограничений:

  • В запрос нельзя включать предложение ORDER BY. Не имеет смысла сортировать таблицу результатов запроса, поскольку она добавляется в таблицу, которая, как и все остальные, не упорядочена.

  • Таблица результатов запроса должна содержать такое же количество столбцов, что и оператор INSERT (или полностью всю целевую таблицу, если список столбцов опущен), а типы данных соответствующих столбцов таблицы результатов запроса и целевой таблицы должны быть совместимыми.

  • Запрос не может быть запросом на объединение нескольких различных операторов select.

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

В стандарте SQL2 последние два ограничения были ослаблены, и в запросе допускаются объединения операторов, объединения таблиц и выражения; разрешается также "самодобавление".

Утилиты пакетной загрузки

Часто возникает необходимость загрузить в базу данных информацию из другого компьютера или из файла, в который она была собрана из различных источников. Для загрузки данных в таблицу можно было бы написать программу с циклом, в котором из файла считывается одна запись, а затем с помощью однострочного оператора insert эта запись добавляется в таблицу. Однако "накладные расходы", связанные с циклическим выполнением однострочного оператора insert, могут оказаться очень высокими. Если принять, что в типичном случае ввод одной строки занимает полсекунды, то для интерактивного режима это, по-видимому, допустимое быстродействие. Но если необходимо загрузить 50000 строк данных, то такое быстродействие неприемлемо. Загрузка данных в этом случае заняла бы свыше шести часов.

По этой причине во всех коммерческих СУБД имеются средства пакетной загрузки, которые с высокой скоростью загружают данные из файла в таблицу. В стандарте SQL этот тип загрузки не упоминается и обычно он осуществляется автономными служебными утилитами без участия SQL. Утилиты различных поставщиков СУБД немного отличаются набором функций, команд и свойств.