Как мне сразу вставить несколько значений в таблицу postgres?

93

У меня есть таблица, в которой я пытаюсь обновить сразу несколько значений. Вот схема таблицы:

    Column     |  Type   | Modifiers 
---------------+---------+-----------
 user_id       | integer | 
 subservice_id | integer |

У меня есть, user_idи я хочу вставить сразу несколько subservice_id. Есть ли в нем синтаксис Postgres, который позволит мне сделать что-то вроде этого

insert into user_subservices(user_id, subservice_id) values(1, [1, 2, 3]);

Как мне это сделать?

джхамм
источник
1
Если вы хотите вставить их из последовательности или с помощью, generate_seriesсм. Dba.stackexchange.com/a/89544/16892
rogerdpack 08

Ответы:

172

Синтаксис многозначной вставки:

insert into table values (1,1), (1,2), (1,3), (2,1);

Но ответ Крокодилко гораздо хитрее.

Скотт Марлоу
источник
Есть ли способ вернуть символ id?
dvtan
2
Да, используйте возврат. "вставить в таблицу (id, yada) значения (1,2), (9,22) возвращая id;" и т.д
Скотт Марлоу
1
Также в настоящее время часто хорошо работает оператор CTE или WITH.
Скотт Марлоу
Целочисленные значения можно вставлять, как указано выше. Но при вставке текста с использованием вышеуказанного метода возникает ошибка, например, столбец не существует. insert into orders_cancel_reasons_infos values (1,1,"Changed my mind",1), (2,2,"Quality not satisfactory",1), (3,3,"Incompatible or not useful",1), (4,4,"Damaged product but shipping box is good",1), (5,5,"Items arrived too late",1), (6,6,"Missing part or accessories",1), (7,7,"Product and shipping box are damaged",1), (8,8,"Wrong item was sent",1), (9,9,"Defective item",1), (10,10,"Inaccurate description",1), (11,11,"Other",1);
санкар муниаппа
@sankarmuniyappa вам нужно будет использовать одинарные кавычки ' 'для текста, который вы вставляете. так что-то вроде, insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)будет работать. Вы можете проверить это , чтобы узнать больше об одинарных и двойных кавычках.
dr0pdb
25

Укороченный вариант ответа Крокодилко:

insert into user_subservices(user_id, subservice_id) 
values(1, unnest(array[1, 2, 3]));
Ялли
источник
Я думаю, что это более выразительно, чем принятый ответ. Это стандартный SQL или специфичный для PostgreSQL?
Бернард,
3
Оба ответа относятся к PostgreSQL. Принятый ответ , возможно , более легко переведен в другие базы данных, Oracle, например: insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3)).
yallie
Спасибо, на мой взгляд, это имеет гораздо больше смысла и более читабельно, чем принятый ответ.
Frosty
1
Как использовать это с информацией из другой таблицы: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Эфрен
12

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

insert into user_subservices (user_id, subservice_id)
select *
from unnest(array[1, 2], array[3, 4]);
Андреас Халтгрен
источник
3

Более надежный пример, когда вам нужно вставить несколько строк в одну таблицу для каждой строки в другой таблице:

INSERT INTO user_subservices (user_id, subservice_id)
SELECT users.id AS user_id, subservice_id
FROM users
CROSS JOIN unnest(ARRAY[1,2,3]) subservice_id;
Энвек
источник