한 번에 여러 값을 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를 반환하는 테이블 (id, yada) 값 (1,2), (9,22)에 삽입;" etc
Scott Marlowe

1
또한 요즘에는 CTE 일명 WITH 문이 종종 잘 작동합니다.
Scott Marlowe

정수 값은 위와 같이 삽입 할 수 있습니다. 그러나 위의 방법을 사용하여 텍스트를 삽입하는 동안 열과 같은 오류가 발생하지 않습니다. 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

26

krokodilko의 대답의 짧은 버전 :

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

나는 이것이 받아 들여지는 대답보다 의도를 더 표현한다고 생각합니다. 이 표준 SQL 또는 PostgreSQL 전용입니까?
Bernard

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%')));
Efren

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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.