Programming/Oracle

[Oracle] DML: INSERT, UPDATE, DELETE

Isaac S. Lee 2023. 8. 30. 15:47

💡INSERT


INSERT는 DML의 한 종류이다.

테이블에 데이터를 추가하는 명령어이다.

 

INSERT 구문

insert into 테이블명 (컬럼리스트) values (값리스트)

 

INSERT의 사용

DROP TABLE tblMemo;

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를 사용하기 전에 필요한 테이블과 시퀀스를 생성해 주었다.

 

표준적인 INSERT 구문

INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, 'Isaac', 'Memo입니다.', sysdate);

원본 테이블에 정의된 컬럼 순서대로 컬럼리스트와 값리스트를 구성하는 방법을 말한다.
특별한 이유가 없다면 이 방식을 사용하는 게 권장된다.

 

컬럼리스트 순서

INSERT INTO tblMemo (seq, memo, regdate, name) values(seqMemo.nextVal, 'Memo입니다.', sysdate, 'Isaac');

컬럼리스트의 순서는 원본 테이블과 상관이 없다.
단, 컬럼리스트와 값리스트의 순서는 동일해야 한다.

 

ORA-00947: not enough values

INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, 'Memo입니다.', sysdate);

값이 모자른 경우에 에러를 출력한다.

 

ORA-00913: too many values

INSERT INTO tblMemo (seq, memo, regdate) values(seqMemo.nextVal, 'Isaac', 'Memo입니다.', sysdate);

이번에는 컬럼이 3개인데 값을 4개를 주었다.
앞의 오류와 반대로 값이 너무 많다는 오류를 반환한다.

 

null 컬럼 조작

--null 상수
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, 'Isaac', null, sysdate);
--컬럼 생략
INSERT INTO tblMemo (seq, name, regdate) values(seqMemo.nextVal, 'Isaac', sysdate);

null 상수를 사용하는 방법과 컬럼을 생략하는 방법으로 null 컬럼을 조작할 수 있다.

 

default 컬럼 조작

--컬럼 생략
INSERT INTO tblMemo (seq, memo, regdate) values(seqMemo.nextVal, 'Memo입니다.', sysdate);

컬럼을 생략하는 순간 null이 대입되고, default를 호출한다.

 

--null 상수
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, null, 'Memo입니다.', sysdate);

개발자의 의도가 null을 입력한 것으로 인식하여 default가 동작되지 않고, null이 들어간다.

 

--default 상수
INSERT INTO tblMemo (seq, name, memo, regdate) values(seqMemo.nextVal, default, 'Memo입니다.', sysdate);

default 상수를 입력하여 default를 호출할 수 있다.

 

생략

INSERT INTO tblMemo values(seqMemo.nextVal, 'Isaac', 'Memo입니다.', sysdate);

--ORA-01841: (full) year must be between -4713 and +9999, and not be 0
INSERT INTO tblMemo values(seqMemo.nextVal, 'Memo입니다.', sysdate, 'Isaac');

컬럼리스트를 생략하여 사용할 수 있다.
컬럼시트를 생략하면 테이블의 원본 컬럼 순서대로 값리스트를 작성해야 한다.  머릿속에 원본 테이블의 순서를 외우고 있어야만 쓸 수 있다.
자주 쓰는 테이블이 아니라면 컬럼리스트를 생략하여 사용하는 게 힘들다.

 

--ORA-00947: not enough values
INSERT INTO tblMemo values(seqMemo.nextVal, 'Isaac', sysdate);

INSERT INTO tblMemo values(seqMemo.nextVal, 'Isaac', null, sysdate);
--ORA-00947: not enough values
INSERT INTO tblMemo values(seqMemo.nextVal, 'Memo입니다.', sysdate);

INSERT INTO tblMemo values(seqMemo.nextVal, DEFAULT, 'Memo입니다.', sysdate);

null 컬럼 또는 default 컬럼을 생략할 수 없다.

 

테이블을 복사하여 새 테이블(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;
SELECT * FROM tblMemoCopy;

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

8건의 INSERT가 발생하였다.

이를 Sub Query 기술이라고 한다.

 

테이블을 복사하여 새 테이블(tblMemoCopy2) 생성

CREATE TABLE tblMemoCopy2 AS SELECT * FROM tblMemo;

SELECT * FROM tblMemoCopy2;

INSERT INTO tblMemoCopy2 (seq, name, memo, regdate) values(9, 'Isaac', 'Memo입니다.', sysdate);

완전히 동일한 테이블을 하나 생성한다는 점에서 위의 복사와 차이가 있다.
그런데 데이터를 넣어 보니 제약 사항이 복사되지 않는것을 확인할 수 있다.
복사된 테이블은 공간만 존재할 뿐이고 구조가 없어 실사용할 수 없다.
주로 다량의 임시 데이터를 사용할 때와 더미데이터를 만들 때 사용한다.

 

💡UPDATE


UPDATE는 DML의 한 종류이다.

원하는 행의 원하는 컬럼값을 수정하는 명령어이다.

 

UPDATE 구문

update 테이블명 set 컬럼명=값 [컬럼명=값] x N [WHERE절]

 

UPDATE의 사용

UPDATE tblCountry SET capital = '세종';

UPDATE문은 기본적으로 모든 데이터를 변환하므로 사용에 주의해야 한다.

만약 이게 회원의 주소였다면 1400명의 주소를 모두 한 명의 주소로 바꿔버릴 수도 있다.

민사소송을 당하고 싶다면 WHERE절을 사용하지 않으면 된다.

 

WEHRE절 지정

UPDATE tblCountry SET capital = '세종' WHERE name = '대한민국';

 

다중 컬럼리스트 수정

UPDATE tblCountry SET
		capital = '세종',
		population = population + 100,
		continent = 'EU'
WHERE name = '대한민국';

 

💡DELETE


DELETE는 DML의 한 종류이다.

원하는 행의 원하는 컬럼값을 수정하는 명령어이다.

 

DELETE 구문

delete [from] 테이블명 [where절]

from은 생략할 수 있다.

 

DELETE의 사용

SELECT * FROM tblinsa;

DELETE FROM tblInsa WHERE num = 1001;
DELETE FROM tblInsa;

데이터를 모두 삭제하였다.

이제 민사소송을 준비하도록 하자.