PostgreSQL의 선택 쿼리에서 테이블에 값을 삽입하는 방법은 무엇입니까?


198

나는 테이블 items (item_id serial, name varchar(10), item_group int)과 테이블이 items_ver (id serial, item_id int, name varchar(10), item_group int)있습니다.

이제 items_verfrom에 행을 삽입하고 싶습니다 items. 이 작업을 수행하는 데 필요한 짧은 SQL 구문이 있습니까?

나는 시도했다 :

INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);

하지만 구문 오류가 발생합니다.

ERROR:  syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...

나는 지금 시도했다 :

INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

더 잘 작동했지만 오류가 발생했습니다.

ERROR:  column "item_group" is of type integer but expression is of type 
character varying
LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

테이블에서 열이 다른 순서로 정의 되었기 때문일 수 있습니다. 열 순서가 중요합니까? PostgreSQL이 열 이름과 일치하기를 바랍니다.

답변:


288

열 순서는 열 순서가 일치하는 경우에만 중요합니다. 예를 들어 다음과 같습니다.

insert into items_ver
select * from items where item_id=2;

또는 그들이 일치하지 않으면 예를 들면 다음과 같습니다.

insert into items_ver(item_id, item_group, name)
select * from items where item_id=2;

그러나 열 순서에 의존하는 것은 버그가 발생하기를 기다리는 것입니다 (열 수와 마찬가지로 변경 가능)-또한 SQL을 읽기가 어렵습니다.

올바른 '바로 가기'는 없습니다. 삽입 할 테이블과 소스 데이터에 사용중인 쿼리 모두에 대한 열을 명시 적으로 나열해야합니다. 예 :

insert into items_ver (item_id, name, item_group)
select item_id, name, item_group from items where item_id=2;

여기 dbfiddle


5
INSERT INTO test_import_two (name, name1, name2) 
(SELECT name, name1, name2 FROM test_import_one WHERE id = 2)

같은 테이블

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)

-1
INSERT INTO gate_pass(
     site_id, gate_pass_element, sequence_no, createdby, createddate, lastmodifiedby, lastmodifieddate)
SELECT 1,   gatepasselement, 3, 1,now(),1,now()  
FROM unnest(string_to_array('Bhushan,Amol,pallavi', E',')) as gatepasselement;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.