UPDATE SET

Тема дорожной карты · PostgreSQL

Оператор UPDATE в PostgreSQL предназначен для изменения существующих строк в таблице. Предложение SET указывает, какие столбцы необходимо изменить и какие значения им присвоить. Вместе эти элементы позволяют эффективно обновлять данные в базе данных, что особенно важно для поддержания актуальности информации в реальном времени. Оператор UPDATE также принимает предложение WHERE, которое ограничивает строки, подлежащие изменению. Пропуск этого условия приводит к изменению всех строк в таблице, что может привести к нежелательной потере данных.

Как это работает

Оператор UPDATE ... SET в PostgreSQL использует стандартные SQL-запросы (SELECT, INSERT, UPDATE, DELETE) для управления данными. В PostgreSQL есть расширения, такие как INSERT ... ON CONFLICT (col) DO UPDATE (upsert), INSERT ... RETURNING (получение строки без второго SELECT), UPDATE ... WHERE ... RETURNING, DELETE ... RETURNING, а также CTE (WITH ... AS), включая writable CTE (WITH inserted AS (INSERT ...) SELECT ...). Параметризованные запросы ($1, $2 в libpq / ? в драйверах) являются обязательными для обеспечения безопасности запросов, предотвращая SQL-инъекции.

Когда применять

INSERT ... ON CONFLICT используется для идемпотентных записей, где важно избежать конфликтов при записи данных. Предложение RETURNING полезно, когда требуется получить строку сразу после записи, что позволяет приложениям подтверждать или повторно использовать результат без выполнения дополнительного запроса SELECT. CTE (WITH ... AS) используются для улучшения читаемости сложных запросов; оптимизатор PostgreSQL 12 и выше инлайнит простые non-recursive CTE. Всегда следует параметризовать запросы, так как конкатенация строк является основным путем для SQL-инъекции. Для многошаговых операций следует использовать транзакции, чтобы обеспечить целостность данных.

Типичные ошибки

При использовании оператора UPDATE SET могут возникнуть различные проблемы. Например, выполнение запроса DELETE FROM tbl без условия WHERE приведет к удалению всех данных из таблицы, что может быть критичным для работы системы. Также распространенной ошибкой является выполнение UPDATE без условия WHERE, что может привести к изменению всех строк таблицы, если не был использован транзактный блок BEGIN; SELECT count(*) WHERE ...; UPDATE .... Использование огромных списков значений в условии WHERE id IN (1,2,...,10000) вместо использования массива или JOIN может привести к перегрузке парсера запроса. Наконец, отсутствие транзакций для многострочных бизнес-операций может привести к частичному выполнению операций при сбое системы.

Связанные понятия

Полезные ресурсы