double arrow

МНОГОСТРОЧНЫЙ ОПЕРАТОР INSERT


ДОБАВЛЕНИЕ ВСЕХ СТОЛБЦОВ

Добавление значений NULL

При добавлении в таблицу новой строки всем столбцам, имена которых отсутствуют в списке столбцов оператора insert, автоматически присваивается значение null. В операторе insert, с помощью которого в таблицу salesreps была добавлена информация о служащем Якобсене, были опущены столбцы quota и manager:

Из-за этого новая строка в столбцах quota и manager содержит значение null. Значение null можно присвоить и явным образом, включив эти столбцы в список столбцов, а в списке значений задав для них ключевое слово null. Применение следующего оператора insert приведет к тому же результату, что и в предыдущем случае:

Для удобствам SQL разрешается не включать список столбцов в оператор insert. Если список столбцов опущен, он генерируется автоматически и в нем слева направо перечисляются все столбцы таблицы. При выполнении оператора select * генерируется такой же список столбцов. Пользуясь этой сокращенной формой записи, предыдущий оператор insert можно переписать таким образом:

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




В интерактивном режиме удобно не включать в оператор insert список столбцов, так как это уменьшает длину оператора. В случае программного SQL список столбцов должен быть задан всегда, поскольку такую программу легче читать и понимать.

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

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

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

Вот еще одна ситуация, когда можно использовать многострочный оператор insert. Предположим, требуется проанализировать, что именно приобретают клиенты, и для этого необходимо просмотреть информацию о клиентах и служащих, имеющих большие заказы - стоимостью свыше $15000. Запросы, которые необходимо для этого выполнить, объединяют информацию из таблиц customers, salesreps и orders. В маленькой учебной базе данных эти трехтабличные запросы будут выполняться довольно быстро, но в реальной корпоративной базе данных, содержащей тысячи строк информации, выполнение таких запросов заняло бы длительное время



Вместо выполнения нескольких длинных трехтабличных запросов лучше создать для требуемых данных новую таблицу с именем bigorders, имеющую следующую структуру:

Столбец Информация
amount Стоимость заказа (из таблицы orders)
company Имя клиента (из таблицы customers)
name Имя служащего (из таблицы salesreps)
perf Перевыполнение/недовыполнение плана (вычисляется по таблице SALESREPS)
mfr Идентификатор производителя (из таблицы orders)
product Идентификатор товара (из таблицы orders)
qty Заказанное количество (из таблицы orders)

После создания таблицы bigqrders ее можно заполнить данными с помощью следующего оператора insert:

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



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

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

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

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

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

Если принять, что в типичном случае ввод одной строки занимает полсекунды, то для интерактивного режима это, по-видимому, допустимое быстродействие. Но если необходимо загрузить 50000 строк данных, то такое быстродействие неприемлемо. Загрузка данных в этом случае заняла бы свыше шести часов.

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







Сейчас читают про: