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. 주의사항
- 컬럼 수와 데이터 타입 일치
target_table과 source_table의 컬럼 수와 데이터 타입이 반드시 일치해야 합니다. - 기존 데이터 중복 방지
employees_backup 테이블에 이미 존재하는 데이터를 중복 삽입하지 않으려면 ON CONFLICT 또는 조건문을 추가로 사용할 수 있습니다. - 트랜잭션 사용 권장
대량 데이터를 처리할 경우 BEGIN과 COMMIT으로 트랜잭션을 사용해 안정성을 확보하세요.
BEGIN;
INSERT INTO employees_backup (name, position, salary)
SELECT name, position, salary
FROM employees;
COMMIT;
LIST
'Develop' 카테고리의 다른 글
TinyMCE 에디터 사용 방법과 이미지 첨부 커스텀마이징 (1) | 2025.01.22 |
---|---|
데이터베이스의 개행문자를 HTML에서 줄바꿈으로 표시하는 3가지 방법 (2) | 2025.01.21 |
[JavaScript] 문자열을 구분자로 배열로 나누는 방법 - Split() (2) | 2025.01.20 |
CI와 DI의 개념 및 용도 (3) | 2025.01.20 |
[jQuery] forEach 와 each 사용법과 다양한 예제 (2) | 2025.01.13 |