DELETE 는 자료를 삭제할 때 쓰는 명령어이다.

예시를 통해 알아보자.

-- emp_score1 테이블에서 empNo = '1001' 인 자료 삭제
DELETE FROM emp_score1 WHERE empNo = '1001';
SELECT * FROM emp_score1; -- 확인용
COMMIT;

DELETE FROM 테이블명 WHERE 조건; 조건에 해당하는 자료를 삭제한다.

 

실습용 테이블 생성

CREATE TABLE emp1 AS
    SELECT * FROM emp;

CREATE TABLE emp_score1 AS
    SELECT * FROM emp_score;

 

emp_score1 테이블에서 남자만 삭제해보자.

-- 남자만 뽑기
SELECT empNo FROM emp1 WHERE MOD( SUBSTR(rrn, 8, 1), 2) = 1;

DELETE FROM emp_score1 WHERE empNo IN
( SELECT empNo from emp1 WHERE MOD( SUBSTR(rrn, 8, 1), 2) = 1);
SELECT * FROM emp_score1; -- 확인용
COMMIT;

먼저 남자만 뽑고, emp_score1에서 삭제할 때는 IN 뒤에 남자만 뽑은 서브쿼리를 줘서 같은 값을 가지고 있는 empNo들을 삭제하도록 했다.

 

테이블의 모든 자료 삭제 시, 구조는 삭제가 되지 않는다.

DELETE와 TRUNCATE를 이용해 모든 레코드를 삭제할 수 있다.

차이

  • TRUNCATE는 DELETE보다 더 빠르다. 
  • TRUNCATE는 자동 COMMIT이 된다.
DELETE FROM emp1;
SELECT * FROM emp1; -- 다 삭제되었는지 확인용
COMMIT;
DESC emp1; -- 구조 확인

실습용 테이블 삭제

DROP TABLE emp_score1 PURGE;
DROP TABLE emp1 PURGE;

PURGE를 써야 휴지통에 담기지 않고 삭제된다.

PURGE 안 썼을 시 휴지통 비우기 >

 

DELETE를 이용해 실수로 삭제하거나 수정한 경우 복구 방법에 대해 알아보자.

단, 오래전에 삭제한 자료는 불가

DELETE FROM emp WHERE city = '서울';
COMMIT;
SELECT * FROM emp;

실수로 서울에 사는 사람들의 정보를 삭제했다.

-- 30분전의 emp 테이블
SELECT * FROM emp
AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '30' MINUTE);

30분전의 emp 테이블에는 서울에 사는 사람들도 있었기 때문에 30분 전으로 했다. ( 실수로 삭제한 시간보다 전이면 됨)

이 쿼리를 실행하면 삭제 전의 테이블이 나온다.

 

30분전의 emp 테이블로 삭제된 데이터를 복구시켜보자.

-- 30분전의 emp 테이블로 삭제된 데이터 복구
SELECT * FROM emp
AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE city='서울';

INSERT INTO emp (
    SELECT * FROM emp
    AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '30' MINUTE)
    WHERE city='서울'
);

SELECT * FROM emp; -- 데이터가 잘 들어갔는지 확인용
COMMIT; -- 트랙잭션 완료

내가 삭제한 서울사람들만 추가할 필요가 있으므로 30분 전의 emp 테이블에서 내가 삭제한 자료들만 먼저 출력해보았다. 그 후 INSERT INTO 테이블 ( 값을 가진 컬럼들 ); 을 통해 다시 넣어서 복구시켜주었다.

+ Recent posts