All of My Records

[Oracle] INSERT문

by 캐떠린

INSERT

  • DML
  • 테이블에 데이터를 추가하는 명령어
INSERT INTO 테이블명 (컬럼리스트) VALUES (값리스트);

 

1. 표준

  • 원본 테이블의 정의된 컬럼 순서대로 컬럼 리스트와 값 리스트를 구성하는 방법
  • 특별한 이유가 없으면 이 방식 사용
CREATE TABLE tblMemo
(
   seq number(3) PRIMARY KEY,      --메모번호(PK)
   name varchar2(30) DEFAULT '익명',      --작성자(UQ)
   memo varchar2(1000),   --메모(NN)
   regdate DATE DEFAULT sysdate NOT NULL    --작성날짜
);

DROP SEQUENCE seqMemo;
CREATE SEQUENCE seqMemo;


SELECT * FROM tblMemo;
-- 여기까지 연습용 테이블 셋팅

INSERT INTO tblMemo (seq, name, memo, regdate) 
            VALUES (seqMemo.nextVal, '홍길동', '메모입니다.', sysdate);

 

2. 컬럼리스트의 순서는 원본 테이블과 상관 없다.

컬럼 리스트와 값 리스트의 순서만 동일하면 된다.

INSERT INTO tblMemo (seq, memo, regdate, name) 
            VALUES (seqMemo.nextVal, '홍길동', '메모입니다.', sysdate);
--> ORA-01841: (full) year must be between -4713 and +9999, and not be 0 > 컬럼리스트의 순서를 바꾸면 값리스트의 순서도 바꿔야 한다.
           
INSERT INTO tblMemo (seq, memo, regdate, name) 
            VALUES (seqMemo.nextVal, '메모입니다.', sysdate, '홍길동');

 

3. ORA-00947: not enough values(컬럼 리스트의 개수가 값 리스트의 개수보다 많을 때)

INSERT INTO tblMemo (seq, name, memo, regdate) 
            VALUES (seqMemo.nextVal, '메모입니다.', sysdate);
--> ORA-00947: not enough values > 컬럼이 4개인데 값이 3개라 Error 발생

 

4. ORA-00913: too many values(컬럼 리스트의 개수가 값 리스트의 개수보다 적을 때)

INSERT INTO tblMemo (seq, memo, regdate) 
            VALUES (seqMemo.nextVal, '홍길동', '메모입니다.', sysdate);
--> ORA-00913: too many values > 컬럼이 3개인데 값이 4개라 Error 발생

 

5. NULL 컬럼 조작

-- 5.a null 상수 직접입력
INSERT INTO tblMemo (seq, name, memo, regdate) 
            VALUES (seqMemo.nextVal, '홍길동', null, sysdate);
            
-- 5.b 컬럼 생략(컬럼리스트, 값리스트에서 생략 > null컬럼인 경우 자동으로 null 입력)
INSERT INTO tblMemo (seq, name, regdate) 
            VALUES (seqMemo.nextVal, '홍길동', sysdate);

 

6. DEFAULT 컬럼 조작

-- 6.a 컬럼 생략 > default 호출 > DEFAULT값 입력됨
INSERT INTO tblMemo (seq, memo, regdate) 
            VALUES (seqMemo.nextVal, '메모입니다.', sysdate);
           
-- 6.b null 상수 > null 대입(개발자 의지 표현) > default 동작 안함 > NULL 입력됨
INSERT INTO tblMemo (seq, name, memo, regdate) 
            VALUES (seqMemo.nextVal, null, '메모입니다.', sysdate);
           
-- 6.c default 상수 > DEFAULT값 입력됨
INSERT INTO tblMemo (seq, name, memo, regdate) 
            VALUES (seqMemo.nextVal, default, '메모입니다.', sysdate);

 

7. 단축(생략)

  • 컬럼 리스트를 생랴갛면 테이블의 원본 컬럼 순서대로 값 리스트를 작성해야 한다.
  • 값 리스트에서 일부를 생략하고 싶다면 컬럼 리스트도 생략할 값 리스트와 동일하게 작성해야 한다.
-- 컬럼리스트를 생략할 수 있다. > 단, 값의 순서를 바꿀 수 없다.
INSERT INTO tblMemo VALUES (seqMemo.nextVal, '홍길동', '메모입니다.', sysdate);

-- 컬럼시트를 생략하면 테이블의 원본 컬럼 순서대로 값리스트를 작성해야 한다.
INSERT INTO tblMemo VALUES (seqMemo.nextVal, '메모입니다.', sysdate, '홍길동'); -- > Error 발생

-- null 컬럼을 생략 불가능
INSERT INTO tblMemo VALUES (seqMemo.nextVal, '홍길동', sysdate); -- ORA-00947: not enough VALUES
INSERT INTO tblMemo VALUES (seqMemo.nextVal, '홍길동', NULL, sysdate);

-- default 컬럼을 생략 불가능
INSERT INTO tblMemo VALUES (seqMemo.nextVal, '메모입니다.', sysdate); -- ORA-00947: not enough values
INSERT INTO tblMemo VALUES (seqMemo.nextVal, default, '메모입니다.', sysdate);

 

8. 다른 테이블의 결과 레코드를 새 테이블에 INSERT 하기

-- tblMemo 테이블 > 복사 > 새 테이블 생성(tblMemoCopy)
CREATE TABLE tblMemoCopy
(
   seq number(3) PRIMARY KEY,      --메모번호(PK)
   name varchar2(30) DEFAULT '익명',      --작성자(UQ)
   memo varchar2(1000),   --메모(NN)
   regdate DATE DEFAULT sysdate NOT NULL    --작성날짜
);

SELECT * FROM tblMemo;

INSERT INTO tblMemoCopy SELECT * FROM tblMemo; -- Sub Query

SELECT * FROM tblMemoCopy;

 

9. 기존 테이블 복사하여 새 테이블 생성하기

⚠️주의⚠️ 제약 사항은 복사되지 않는다.

-- tblMemo 테이블 > 복사 > 새 테이블 생성(tblMemoCopy2)
-- 제약 사항이 복사가 안된다.
-- 임시 테스트용으로만 사용 > 다량의 데이터, 임시 데이터
CREATE TABLE tblMemoCopy2 AS SELECT * FROM tblMemo;

SELECT * FROM tblMemocopy2;

INSERT INTO tblMemoCopy2 (seq, name, memo, regdate) 
            VALUES (15, '홍길동', '메모입니다.', sysdate);
-- 8번과 육안상 동일하나 다름! > 쓸모가 없음! Because of 제약사항이 복사가 안되기 때문!!!!!!!!!!! 단지 공간만 존재. 내부 데이터는 실 사용을 하기 어려움!

 

*글 작성에 참고한 내용: 학원 쌤의 열정적인 수업

'DB > Oracle' 카테고리의 다른 글

[Oracle] UPDATE문, DELETE문  (1) 2024.03.18
[Oracle] 시퀀스(Sequence)  (0) 2024.03.18
[Oracle] DDL  (0) 2024.03.18
[Oracle] 함수 :: 날짜 시간 함수(date time function)  (0) 2024.03.18
[Oracle] 함수 :: 형변환 함수(casting function)  (0) 2024.03.18

블로그의 정보

All of My Records

캐떠린

활동하기