메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Oracle (토론 | 기여)님의 2025년 5월 14일 (수) 01:29 판


✅ 기본 개념 설명

INSERT 구문은 테이블에 새로운 데이터를 추가할 때 사용됩니다.

✅ 기본 문법

INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);

• INSERT INTO: 데이터를 추가할 테이블명을 지정합니다. • (컬럼1, 컬럼2, ...): 어떤 컬럼에 값을 넣을지를 지정합니다. • VALUES (...): 해당 컬럼들에 대응하는 값을 입력합니다.

✅ 예제 1: 간단한 데이터 추가

고객 정보를 담는 CUSTOMER 테이블이 아래와 같다고 가정하겠습니다.

ID (NUMBER) NAME (VARCHAR2) EMAIL (VARCHAR2)


SQL 예제:

INSERT INTO CUSTOMER (ID, NAME, EMAIL) VALUES (1, '홍길동', 'hong@example.com');

이 구문은 ID가 1이고 이름은 ‘홍길동’, 이메일은 ‘hong@example.com’인 고객 정보를 추가하는 것입니다.

✅ 예제 2: 컬럼 이름 생략 (모든 컬럼에 값을 넣는 경우)

테이블의 컬럼 순서를 정확히 알고 계신 경우, 컬럼명을 생략하고 아래와 같이 작성하실 수도 있습니다.

INSERT INTO CUSTOMER VALUES (2, '김철수', 'kim@example.com');

※ 이 방법은 컬럼 순서가 바뀌지 않았을 때만 안전합니다. 컬럼 순서가 바뀌면 오류가 발생할 수 있습니다.

✅ 예제 3: 다른 테이블에서 데이터 복사

다른 테이블의 데이터를 이용하여 INSERT하는 방법도 있습니다.

INSERT INTO CUSTOMER (ID, NAME, EMAIL) SELECT EMP_ID, EMP_NAME, EMP_EMAIL FROM EMPLOYEE WHERE DEPARTMENT = 'SALES';

위 구문은 EMPLOYEE 테이블에서 부서가 ‘SALES’인 직원을 CUSTOMER 테이블에 추가하는 예제입니다.

✅ 추가 팁 • 데이터를 추가한 후, COMMIT; 명령어를 실행하셔야 실제로 데이터가 저장됩니다. • 만약 잘못 입력하셨다면, ROLLBACK;을 통해 마지막 COMMIT 이전 상태로 되돌릴 수 있습니다. • 컬럼 수와 값의 수는 반드시 일치해야 합니다.

고급 기능

다음 기능들은 대량 데이터 처리, 조건부 삽입, 트랜잭션 제어 등에서 매우 유용합니다.

✅ 1. INSERT ALL — 여러 행을 한 번에 삽입 (다중 INSERT)

INSERT ALL

 INTO CUSTOMER (ID, NAME, EMAIL) VALUES (3, '이순신', 'lee@example.com')
 INTO CUSTOMER (ID, NAME, EMAIL) VALUES (4, '유관순', 'yoo@example.com')
 INTO CUSTOMER (ID, NAME, EMAIL) VALUES (5, '안중근', 'ahn@example.com')

SELECT * FROM DUAL;

• INSERT ALL은 여러 레코드를 한 번에 삽입할 때 사용합니다. • SELECT * FROM DUAL은 형식상 필요합니다. DUAL은 Oracle의 가상 테이블입니다.

✅ 2. INSERT FIRST — 조건에 맞는 첫 번째 문장만 실행

INSERT FIRST

 WHEN SALARY > 5000 THEN
   INTO HIGH_SAL_EMP (EMP_ID, NAME, SALARY) VALUES (EMP_ID, NAME, SALARY)
 WHEN SALARY BETWEEN 3000 AND 5000 THEN
   INTO MID_SAL_EMP (EMP_ID, NAME, SALARY) VALUES (EMP_ID, NAME, SALARY)
 ELSE
   INTO LOW_SAL_EMP (EMP_ID, NAME, SALARY) VALUES (EMP_ID, NAME, SALARY)

SELECT EMP_ID, NAME, SALARY FROM EMPLOYEE;

• 이 구문은 조건에 따라 다른 테이블로 분기해서 삽입합니다. • INSERT FIRST는 첫 번째 조건만 실행되며, 나머지는 건너뜁니다.

✅ 3. RETURNING INTO — INSERT한 후 값을 바로 변수에 저장 (PL/SQL에서 사용)

DECLARE

 v_id NUMBER;

BEGIN

 INSERT INTO CUSTOMER (ID, NAME, EMAIL)
 VALUES (CUSTOMER_SEQ.NEXTVAL, '장보고', 'jang@example.com')
 RETURNING ID INTO v_id;
 DBMS_OUTPUT.PUT_LINE('삽입된 고객 ID: ' || v_id);

END;

• RETURNING INTO는 삽입 직후에 생성된 값을 변수에 즉시 저장합니다. • 보통 시퀀스와 함께 자주 사용됩니다.

✅ 4. 병렬 INSERT (대용량 INSERT 성능 향상)

ALTER SESSION ENABLE PARALLEL DML;

INSERT /*+ PARALLEL(CUSTOMER, 4) */ INTO CUSTOMER (ID, NAME, EMAIL) SELECT EMP_ID, EMP_NAME, EMP_EMAIL FROM EMPLOYEE;

• PARALLEL 힌트를 사용하면 여러 프로세스를 사용해 INSERT 속도 향상 가능 • 단, ENABLE PARALLEL DML 세션 설정이 필요합니다.

✅ 5. MERGE 문 (조건에 따라 INSERT 또는 UPDATE)

MERGE INTO CUSTOMER c USING TEMP_CUSTOMER t ON (c.ID = t.ID) WHEN MATCHED THEN

 UPDATE SET c.NAME = t.NAME, c.EMAIL = t.EMAIL

WHEN NOT MATCHED THEN

 INSERT (ID, NAME, EMAIL)
 VALUES (t.ID, t.NAME, t.EMAIL);

• MERGE 문은 **“있으면 UPDATE, 없으면 INSERT”**의 로직을 한 번에 처리합니다. • 대량의 동기화 작업에 매우 유용합니다.