Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

[PostgreSQL] Как добавить в таблицу результат запроса SELECT построчно, либо иным образом решить конфликт полей с уникальным содержимым?

Запрос SELECT возвращает множество записей, одно из полей в целевой таблице может содержать только уникальные значения. Решение о том, добавлять строку данных или игнорировать в зависимости от содержимого прочих полей таблицы, прописано в ON CONFLICT, но так как добавление строк происходит "пачкой" в силу атомарности операции INSERT, то ON CONFLICT применяется только для сопоставления с данными, внесёнными предыдущими запросами, и не может решать конфликты в самой выборке. Существует ли решение без того, чтобы группировать выборку по уникальным полям прямо в самом SELECT?
ПрограммированиеSql+1
Андрей Бахматов
  ·   · 1,9 K
В PostgreSQL есть несколько способов решить конфликт полей с уникальным содержимым при добавлении результатов запроса SELECT в таблицу. Один из способов - использовать временную таблицу или подзапрос для фильтрации данных перед вставкой в целевую таблицу. Вот несколько вариантов:
  1. Использование временной таблицы:
  • Создайте временную таблицу, которая будет содержать результаты вашего SELECT запроса.
  • Заполните временную таблицу данными из SELECT запроса.
  • Затем выполните операцию INSERT INTO с использованием ON CONFLICT для вставки данных из временной таблицы в целевую таблицу, решая конфликты с уникальными значениями.
  • Наконец, удалите временную таблицу.
Пример:
CREATE TEMPORARY TABLE temp_data AS SELECT * FROM your_select_query;

INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM temp_data
ON CONFLICT (unique_column) DO NOTHING;

DROP TABLE temp_data;
  1. Использование подзапроса:
  • Вставьте SELECT запрос как подзапрос в операцию INSERT INTO и используйте ON CONFLICT для решения конфликтов с уникальными значениями.
  • Подзапрос может быть приведен к формату, соответствующему структуре целевой таблицы, чтобы корректно вставить данные.
Пример:
INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM (
  -- ваш SELECT запрос
  SELECT *
  FROM your_select_query
) AS subquery
ON CONFLICT (unique_column) DO NOTHING;
Оба этих способа позволят вам вставить результаты SELECT запроса в целевую таблицу, решая конфликты с уникальными значениями. Выберите подходящий для вашего случая и примените его в соответствии с вашими требованиями.
1 эксперт не согласен
Ни один из методов не решает проблему, методы лишь создают правдоподобную видимость решения. Подобная "шляпа" -... Читать дальше