Другие посты объясняют, почему массовые операторы быстрее и как это делать с литеральными значениями.
Я думаю, что важно знать, как это сделать с заполнителями. Отказ от использования заполнителей может привести к появлению гигантских командных строк, цитированию / удалению ошибок и, как следствие, к приложениям, подверженным внедрению SQL.
Массовая вставка с заполнителями в PostgreSQL> = 9,1
Чтобы вставить произвольное количество строк в таблицу «mytable», состоящую из столбцов «col1», «col2» и «col3», все в одном получено (один оператор, одна транзакция):
INSERT INTO mytable (col1, col2, col3)
VALUES (unnest(?), unnest(?), unnest(?))
Вам необходимо указать три аргумента для этого утверждения. Первый должен содержать все значения для первого столбца и так далее. Следовательно, все аргументы должны быть списками / векторами / массивами одинаковой длины.
Массовое обновление с заполнителями в PostgreSQL> = 9,1
Допустим, ваш стол называется "mytable". Он состоит из столбцов «ключ» и «значение».
update mytable
set value = data_table.new_value
from
(select unnest(?) as key, unnest(?) as new_value) as data_table
where mytable.key = data_table.key
Я знаю, это нелегко понять. Это похоже на запутанный SQL. С другой стороны: он работает, масштабируется, работает без объединения строк, он безопасен и невероятно быстр.
Вам необходимо указать два аргумента для этого утверждения. Первым должен быть список / вектор / массив, содержащий все значения для столбца «ключ». Конечно, второй должен содержать все значения для столбца «значение».
В случае, если вы достигнете предельных размеров, вам, возможно, придется изучить COPY INTO ... FROM STDIN
(PostgreSQL).