Як вставити відразу кілька значень у таблицю 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

Відповіді:



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 aka 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);
sankar muniyappa

@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

Дякую, це має набагато більше сенсу і є читабельнішим за прийняту відповідь, на мій погляд.
морозний

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.