[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
캐떠린