INSERT INTO

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

Оператор INSERT INTO — стандартная SQL-команда, используемая для добавления новых строк в таблицу реляционной базы данных PostgreSQL. Это один из основных методов записи данных в базу данных и является ключевым элементом управления данными. Успешное использование INSERT INTO требует понимания различных его возможностей и особенностей, таких как предложение VALUES, INSERT INTO ... SELECT, и ON CONFLICT.

Предложение VALUES принимает один или несколько кортежей строк, разделённых запятыми, позволяя одним оператором INSERT INTO добавлять несколько строк за один запрос. Это не только упрощает процесс добавления данных, но и повышает производительность, так как избегает необходимости выполнения отдельного оператора для каждой строки. PostgreSQL также поддерживает INSERT INTO ... SELECT, который позволяет заполнить таблицу результатом любого запроса SELECT. Это особенно полезно для копирования или преобразования данных внутри одной базы данных.

Необязательное предложение ON CONFLICT придаёт INSERT INTO семантику операции upsert: если новая строка нарушает ограничение уникальности, PostgreSQL может либо проигнорировать конфликт с помощью DO NOTHING, либо обновить существующую строку с помощью DO UPDATE SET. Это позволяет автоматически обрабатывать ситуации, когда добавляемая строка уже существует или нарушает какие-либо ограничения.

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

INSERT INTO использует стандартные 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 используется для идемпотентных записей (без read-then-write race). RETURNING полезен, когда требуется получить строку сразу после записи. CTE используются для улучшения читаемости сложных запросов; оптимизатор инлайнит простые non-recursive CTE с версии PostgreSQL 12. Всегда следует использовать параметризованные запросы, чтобы избежать SQL-инъекций. Для многошаговых операций всегда следует использовать транзакции.

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

Типичные ошибки при использовании INSERT INTO включают удаление всех данных из таблицы без использования условия WHERE (DELETE FROM tbl без WHERE — пуф — данных нет); обновление всех данных в таблице без использования условия WHERE (используйте BEGIN; + SELECT count(*) WHERE ...; перед UPDATE); использование огромных списков значений в условии WHERE id IN (1,2,...,10000) вместо = ANY(array) или JOIN (парсер взрывается); отсутствие транзакций для многострочных бизнес-операций (частичные записи при крахе).

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

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