Иллюстрированный самоучитель по PostgreSQL

Модификация записей командой UPDATE

Обновление нескольких полей

Перечисление команд присваивания в секции SET через запятую позволяет обновить несколько полей таблицы в одной команде. В листинге 4.55 продемонстрировано одновременное изменение полей name и address таблицы publishers для записи с полем id, равным 11З.

Листинг 4.55. Выполнение команды UPDATE с обновлением нескольких полей.

booktown=# UPDATE publishers
booktown-# SET name = 'OVReilly & Associates',
booktown-# address = 'OVReilly & Associates. Inc. '
booktown-# || '101 Morris St, Sebastopol, CA 95472'
booktown-# WHERE id = 113;
UPDATE 1
booktown=# SELECT name, substrtaddress, 1, 40) || '…' AS short_address
booktown-# FROM publishers
booktown-# WHERE id = 113;
name | short_address
O'Reilly & Associates | O'Reilly & Associates. Inc. 101 Morris S…
(1 row)

В этой команде UPDATE значения обоих полей, name и address, заданы в виде строковых констант. Обратите внимание: внутренние апострофы в строках экранируются обратной косой чертой. Команда SELECT позволяет убедиться в правильности выполненного обновления.

Листинг 4.55 также служит примером практического использования оператора конкатенации || и функции substr(). Полю address присваиваются две строковые константы, объединенные оператором || для предотвращения выхода за пределы командной строки терминала. Затем функция substr() усекает выводимый адрес, чтобы он не переносился на другую строку. В данном случае это сделано лишь для удобства чтения выходных данных. Конечно, если вас интересует полное содержимое поля, усекать его не следует.

Обновление записей по нескольким источникам

В PostgreSQL команда SQL UPDATE была дополнена мощной нестандартной возможностью – поддержкой секции FROM. Секция FROM позволяет получать входные данные из других наборов данных (таблиц и подзапросов).

В листинге 4.56 команда UPDATE с секцией FROM обновляет данные таблицы stock по данным таблицы stock_backup. Секция WHERE описывает связь между обновляемой таблицей и источником. Каждый раз, когда в таблицах находятся совпадающие значения isbn, поле retail в таблице stock обновляется значением из резервной таблицы stock_backup.

Листинг 4.56. Команда UPDATE с несколькими источниками.

booktown=# UPDATE stock.
booktown-# SET retail = stock_backup.retail
booktown-# FROM stock_backup
booktown-# WHERE stock.isbn = stock_backup.isbn;
UPDATE 16

Секция FROM поддерживает все разновидности синтаксиса JOIN, описанные в разделе "Выборка данных командой SELECT", что открывает широкие возможности обновления данных в существующих наборах. Более того, как упоминалось выше, в качестве источника данных в секциях FROM могут использоваться подзапросы.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.