[Oracle] INSERT 하기 (insert into values, insert select) , insert statement

오라클 데이터베이스에서 데이터 조작어(Data Manipulation Language) 중 하나인 insert를 하는 방법에 대해 안내해드리겠습니다!

Oracle INSERT

우선 인서트 구문을 테스트 하려는 테이블을 소개하겠습니다.
테이블 이름은 TB_TEST 이며,
컬럼은 총 3개, V(VARCHAR2), N(NUMBER), D(DATE)로 이루어져 있다고 가정하겠습니다.
별도의 키 컬럼은 설정하지 않겠습니다~

INSERT (col) INTO VALUES

INSERT (col) INTO VALUES

인서트 구문에서 컬럼을 지정하는 방법을 우선 소개하겠습니다. 가장 일반적으로 사용하는 구문이기도 하지요. 문법(syntax)는 다음과 같습니다.

--syntax

INSERT INTO [schema.]table_Name (col1, col2, ... colN)
    VALUES (colVal1, colVal2, ... colValN);

테스트 테이블에서 [V]컬럼에 'You', [N]컬럼에 1 을 넣고자 하면 아래와 같이 할 수 있습니다.

INSERT INTO USER_NAME.TABLE_NAME (V, N)
     VALUES ('You', 1);
insert into columns

테이블과 함께 괄호를 통해 넣으려는 칼럼을 지정할 수 있습니다.

INSERT INTO TABLE_NAME (V, N)
     VALUES ('1', 1);

INSERT INTO VALUES

INSERT INTO VALUES

INSERT INTO VALUES 구문은, 아까 소개한 인투 밸류 구문에서 괄호가 빠진 형태입니다.

테이블 이름 뒤에 괄호 이후 컬럼을 나열 안 하는 경우입니다. 이때에는 모든 컬럼 값을 입력하겠다는 약속이랍니다. 문법은 다음과 같습니다

[syntax]
INSERT INTO [schema.]table_Name
    VALUES (colVal1, colVal2, ... colValN);

테스트 테이블은 아이디 순서대로 V, N, D 컬럼이 정의되어 있으므로 그대로 입력합니다.

--칼럼 아이디 순서대로 입력하셔야 합니다.

INSERT INTO USER_NAME.TABLE_NAME
     VALUES ('I', 2, TO_CHAR (SYSDATE, 'YYYY-MM-DD'));

INSERT INTO table Name Values 구문입니다. VALUES 에 값을 입력해 주면 됩니다.

INSERT INTO TABLE_NAME VALUES ('1', 1, SYSDATE);
insert into 괄호

괄호를 생략하는 것은 모든 컬럼을 명시하는 것과 동일한 효과입니다 (specifying all table column)

INSERT INTO USER_NAME.TABLE_NAME (V, N, D)
     VALUES ('I', 2, TO_CHAR (SYSDATE, 'YYYY-MM-DD'));

--이 경우, 아래의 모든 값을 괄호 안에 명시하는 문장과 동일합니다.
INSERT INTO USER_NAME.TABLE_NAME
     VALUES ('I', 2, TO_CHAR (SYSDATE, 'YYYY-MM-DD'));

INSERT INTO SELECT

insert into select

insert into select는 인서트 하려는 컬럼을 직접 SELECT 하여 입력하는 기능을 제공합니다. 문법은 다음과 같습니다.

--[syntax]
INSERT INTO [schema.]table_Name (col1, col2, ... colN)
    SELECT STATEMENT;

다음 예시는 emp 테이블에서 empno 가 7839 인 직원을 조회하여 insert 합니다.

INSERT INTO USER_NAME.TABLE_NAME (V, N, D)
   SELECT ENAME, EMPNO, HIREDATE
     FROM EMP
    WHERE EMPNO = 7839;

INSERT INTO table Name Select 구문입니다. SELECT 를 통해 다른 테이블을 참조할 수 있는 등 유용하게 사용할 수 있습니다.

INSERT INTO TB_TEST
    SELECT '1', 1, SYSDATE FROM DUAL;

INSERT 오류 해결 방법

insert 구문은 값의 수에 따라 오류가 발생할 수 있습니다.

ORA-00913: 값의 수가 너무 많습니다

ORA-00947: 값의 수가 충분하지 않습니다

ORA-00913: 값의 수가 너무 많습니다

ORA-00913: 값의 수가 너무 많습니다

테이블 뒤 괄호보다 넣으려는 값이 많은 경우 ORA-00913: too many values 오류가 발생합니다. 값의 수가 너무 많기 때문입니다.

--ORA-00913: too many values
INSERT INTO TB_TEST (V, N)
     SELECT '1', 1, SYSDATE FROM DUAL; 

ORA-00947: 값의 수가 충분하지 않습니다

ORA-00947: 값의 수가 충분하지 않습니다

INSERT INTO tableName [ VALUES | SELECT ] 는 해당 테이블에 관한 모든 칼럼을 명시해야 합니다. 누락되는 경우, ORA-00947: not enough values 오류가 발생합니다.

--ORA-00947: not enough value
INSERT INTO TB_TEST
     VALUES ('1');

댓글