수색…


기본 INSERT

person이라는 간단한 테이블이 있다고 가정 해 보겠습니다.

CREATE TABLE person (
    person_id BIGINT,
    name VARCHAR(255).
    age INT,
    city VARCHAR(255)
);

가장 기본적인 삽입은 테이블에 모든 값을 삽입하는 것입니다.

INSERT INTO person VALUES (1, 'john doe', 25, 'new york');

특정 열만 삽입하려면 열을 명시 적으로 나타내야합니다.

INSERT INTO person (name, age) VALUES ('john doe', 25);

NOT NULL과 같이 테이블에 제약 조건이있는 경우 두 경우 모두 해당 열을 포함해야합니다.

여러 행 삽입

동시에 여러 행을 데이터베이스에 삽입 할 수 있습니다.

INSERT INTO person (name, age) VALUES 
  ('john doe', 25),
  ('jane doe', 20);

선택 물에서 삽입

select 문으로 테이블에 데이터를 삽입 할 수 있습니다.

INSERT INTO person SELECT * FROM tmp_person WHERE age < 30;

선택 영역의 투영은 삽입에 필요한 열과 일치해야합니다. 이 경우 tmp_person 테이블은 person 과 동일한 열을 갖습니다.

COPY를 사용하여 데이터 삽입

COPY는 PostgreSQL의 대량 삽입 메커니즘입니다. 파일과 테이블간에 데이터를 전송하는 편리한 방법이지만 한 번에 몇 천 개가 넘는 행을 추가 할 때도 INSERT 보다 훨씬 빠릅니다.

샘플 데이터 파일을 만들어 보겠습니다.

cat > samplet_data.csv

1,Yogesh
2,Raunak
3,Varun
4,Kamal
5,Hari
6,Amit

그리고이 데이터를 가져올 수있는 두 개의 열 테이블이 필요합니다.

CREATE TABLE copy_test(id int, name varchar(8));

이제 실제 복사 작업을 수행하면 테이블에 6 개의 레코드가 생성됩니다.

COPY copy_test FROM '/path/to/file/sample_data.csv' DELIMITER ',';

디스크의 파일을 사용하는 대신 stdin 에서 데이터를 삽입 할 수 있습니다

COPY copy_test FROM stdin DELIMITER ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 7,Amol
>> 8,Amar
>> \.
Time: 85254.306 ms

SELECT * FROM copy_test ;
 id |  name
----+--------
  1 | Yogesh
  3 | Varun
  5 | Hari
  7 | Amol
  2 | Raunak
  4 | Kamal
  6 | Amit
  8 | Amar

또한 아래와 같이 테이블의 데이터를 파일에 복사 할 수 있습니다.

COPY copy_test TO 'path/to/file/sample_data.csv'  DELIMITER ',';

복사에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

INSERT 데이터 및 RETURING 값

자동 증분 열이있는 테이블에 데이터를 삽입하고 자동 증분 열의 값을 가져 오려는 경우.

my_table 이라는 테이블이 있다고 my_table .

CREATE TABLE my_table
(
id serial NOT NULL, -- serial data type is auto incrementing four-byte integer
name character varying,
contact_number integer,
CONSTRAINT my_table_pkey PRIMARY KEY (id)
);

my_table 데이터를 삽입하고 해당 행의 ID를 가져 오려면 다음을 수행하십시오.

INSERT INTO my_table(name, contact_number) VALUES ( 'USER', 8542621) RETURNING id;

위 쿼리는 새 레코드가 삽입 된 행의 id를 반환합니다.

데이터를 파일로 선택하십시오.

테이블을 COPY하여 파일에 붙여 넣을 수 있습니다.

postgres=# select * from my_table;
 c1 | c2 | c3 
----+----+----
  1 |  1 |  1
  2 |  2 |  2
  3 |  3 |  3
  4 |  4 |  4
  5 |  5 |   
(5 rows)

postgres=# copy my_table to '/home/postgres/my_table.txt' using delimiters '|' with null as 'null_string' csv header;
COPY 5
postgres=# \! cat my_table.txt
c1|c2|c3
1|1|1
2|2|2
3|3|3
4|4|4
5|5|null_string

UPSERT - INSERT ... CONFLICT DO UPDATE ...

버전 9.5 postgres는 INSERT 문과 함께 UPSERT 기능을 제공합니다.

앞의 몇 가지 예에서 만든 my_table이라는 테이블이 있다고 가정 해보십시오. 삽입 된 행의 PK 값을 반환하는 행을 삽입합니다.

b=# INSERT INTO my_table (name,contact_number) values ('one',333) RETURNING id;
 id
----
  2
(1 row)

INSERT 0 1

이제 기존 고유 키가있는 행을 삽입하려고하면 예외가 발생합니다.

b=# INSERT INTO my_table values (2,'one',333);
ERROR:  duplicate key value violates unique constraint "my_table_pkey"
DETAIL:  Key (id)=(2) already exists.

Upsert 기능은 어쨌든 그것을 삽입하는 기능을 제공하여 충돌을 해결합니다.

b=# INSERT INTO my_table values (2,'one',333) ON CONFLICT (id) DO UPDATE SET name = my_table.name||' changed to: "two" at '||now() returning *;
 id |                       name                             | contact_number
----+-----------------------------------------------------------------------------------------------------------+----------------
  2 | one changed to: "two" at 2016-11-23 08:32:17.105179+00 |            333
(1 row)

INSERT 0 1


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow