Develop

[PostgreSQL] SELECT 데이터를 INSERT하는 방법

issuemaker99 2025. 1. 22. 14:43
728x90

PostgreSQL에서는 INSERT INTO ... SELECT 구문을 사용하여 기존 테이블에서 데이터를 조회(SELECT)하고 이를 새로운 테이블에 바로 삽입할 수 있습니다. 이 방법은 데이터 마이그레이션이나 백업, 데이터 가공 후 저장 등의 작업에 유용합니다. 아래에 예제와 함께 자세히 설명하겠습니다.


1. 기본 구문

INSERT INTO target_table (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM source_table
WHERE 조건;

 

  • target_table: 데이터를 삽입할 테이블
  • source_table: 데이터를 조회할 테이블
  • column1, column2, ...: 삽입하거나 조회할 컬럼들
  • WHERE 조건: 선택적으로 데이터를 필터링하는 조건

2. 실습 예제

예제 시나리오

  • employees 테이블: 기존 데이터가 저장된 테이블
  • employees_backup 테이블: 데이터를 복사할 테이블

1단계: 테이블 생성

먼저, 두 개의 테이블을 생성합니다.

-- 기존 데이터 테이블
CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(50),
    salary NUMERIC(10, 2)
);

-- 백업 테이블
CREATE TABLE employees_backup (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(50),
    salary NUMERIC(10, 2)
);

 

2단계: 샘플 데이터 삽입

employees 테이블에 샘플 데이터를 삽입합니다.

INSERT INTO employees (name, position, salary)
VALUES
    ('Alice', 'Manager', 80000),
    ('Bob', 'Developer', 60000),
    ('Charlie', 'Analyst', 50000);

 

3단계: SELECT하여 데이터 삽입

employees 테이블의 데이터를 employees_backup 테이블로 복사합니다.

INSERT INTO employees_backup (name, position, salary)
SELECT name, position, salary
FROM employees;

 

결과 확인

employees_backup 테이블의 데이터를 확인합니다.

SELECT * FROM employees_backup;

 

출력 결과:

 id |   name   |  position  | salary
----+----------+------------+--------
  1 | Alice    | Manager    | 80000
  2 | Bob      | Developer  | 60000
  3 | Charlie  | Analyst    | 50000

 


3. 응용 예제

조건부 데이터 복사

특정 조건을 만족하는 데이터만 복사하려면 WHERE 절을 사용합니다.

INSERT INTO employees_backup (name, position, salary)
SELECT name, position, salary
FROM employees
WHERE salary > 55000;

 

데이터 변환 후 삽입

데이터를 변환하거나 계산한 후 삽입할 수도 있습니다.

INSERT INTO employees_backup (name, position, salary)
SELECT name, position, salary * 1.1 -- 급여를 10% 인상하여 삽입
FROM employees;

 


4. 주의사항

  1. 컬럼 수와 데이터 타입 일치
    target_table과 source_table의 컬럼 수와 데이터 타입이 반드시 일치해야 합니다.
  2. 기존 데이터 중복 방지
    employees_backup 테이블에 이미 존재하는 데이터를 중복 삽입하지 않으려면 ON CONFLICT 또는 조건문을 추가로 사용할 수 있습니다.
  3. 트랜잭션 사용 권장
    대량 데이터를 처리할 경우 BEGIN과 COMMIT으로 트랜잭션을 사용해 안정성을 확보하세요.
BEGIN;
INSERT INTO employees_backup (name, position, salary)
SELECT name, position, salary
FROM employees;
COMMIT;
LIST