Учебно-практическое пособие москва 2017 ббк



Pdf көрінісі
бет165/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   161   162   163   164   165   166   167   168   ...   243
Байланысты:
Язык SQL. Базовый курс

range = excluded.range
RETURNING *;
Поскольку мы включили в команду предложение RETURNING *, то СУБД сообщит о
том, какие значения получат атрибуты обновленной строки. Как и планировалось,
изменилось только значение атрибута model.
169


aircraft_code |
model
| range
---------------+-----------------+-------
SU9
| Sukhoi SuperJet | 3000
(1 строка)
В случае конфликта по столбцу aircraft_code будет обновлена та строка в таблице
aircrafts_tmp, с которой конфликтовала вновь добавляемая строка. В результате новая
строка добавлена не будет, а будет обновлено значение столбца model в строке, уже
находящейся в таблице. А где PostgreSQL возьмет значение для использования в ко-
манде UPDATE? Это значение будет взято из специальной таблицы excluded, которая
поддерживается самой СУБД. В этой таблице хранятся все строки, предлагаемые для
вставки в рамках текущей команды INSERT. Вот это значение — excluded.model. Зна-
чение столбца range также будет обновлено, но его новое значение — excluded.range —
совпадает со старым.
Обратите внимание, что в предложении DO UPDATE не указывается имя таблицы, т. к.
таблица будет та же самая, которая указана в предложении INSERT.
Предложение ON CONFLICT DO UPDATE гарантирует атомарное выполнение опера-
ции вставки или обновления строк. Атомарность означает, что проверка наличия
конфликта и последующее обновление выполняются как неделимая операция, т. е.
другие транзакции не могут изменить значение столбца, вызывающее конфликт, так,
чтобы в результате конфликт исчез и уже стало возможным выполнить операцию
INSERT, а не UPDATE, или, наоборот, в случае отсутствия конфликта он вдруг появил-
ся, и уже операция INSERT стала бы невозможной. Такая атомарная операция даже
имеет название UPSERT — «UPDATE или INSERT».
Для массового ввода строк в таблицы используется команда COPY. Эта команда может
копировать данные из файла в таблицу. Причем, в качестве файла может служить и
стандартный ввод. Хотя в этом разделе пособия мы, в основном, говорим о вставке
строк в таблицы, но нужно сказать и о том, что эта команда может также выводить
данные из таблиц в файлы и на стандартный вывод.
В качестве примера ввода данных из файла давайте добавим две строки в таблицу
aircrafts_tmp. Сначала необходимо подготовить текстовый файл, содержащий новые
данные. В этом файле каждая строка соответствует одной строке таблицы. Значения
атрибутов разделяются символами табуляции, поэтому пробелы, которые в нашем
примере есть в столбце model, можно вводить в файл без каких-либо дополнительных
экранирующих символов. Заключать строковые значения в одинарные кавычки не
нужно, иначе они также будут введены в таблицу. Завершить файл нужно строкой,
содержащей только символы «\.». Получим файл следующего содержания:
IL9
Ilyushin IL96
9800
I93
Ilyushin IL96-300
9800
\.
Теперь нужно ввести команду COPY, указав полный путь к вашему файлу:


Достарыңызбен бөлісу:
1   ...   161   162   163   164   165   166   167   168   ...   243




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет