개발 지식/[DBMS] Oracle

[Oracle] DML(5) - UPDATE의 기본 개념과 사용 형태

devGSP 2022. 6. 10. 08:00
반응형
이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다.

Java(TM) 플랫폼 : 1.8.0_321
Oracle IDE : 4.1.5.21.78

 

UPDATE의 기본 개념과 사용 형태

 

아래 테이블이 없다면 여기를 클릭하여 테이블을 생성하고 돌아오자.

SELECT * FROM TB_DEPT2;

 

설명

 

데이터 레코드의 정보를 수정할 때 사용하는 명령어

 

 

사용 형태

 

UPDATE [변경할 테이블] SET [변경할 열1] = [데이터1], [변경할 열2] = [데이터2], ... , [변경할 열n] = [데이터n] WHERE [변경할 대상 행을 선별할 조건절]

 

 

사용 예시

 

TB_DEPT2을 조회하면 아래와 같은 결과가 출력된다.

dml5_q1

 

우리나라가 없는 것이 왠지 화가 나니 아래 쿼리를 실행해 보자.

UPDATE TB_DEPT2
   SET LOC = 'SEONGNAM';
   
SELECT * FROM TB_DEPT2;

dml5_q2

헉! 4개 데이터 모두 LOC이 SEONGNAM이 되어 버렸다.

 

위와 같은 경우처럼 UPDATE 혹은 DELETE 쿼리문의 경우 WHERE 조건이 명확하지 않으면 의도치 않은 데이터가 수정되거나 삭제될 수 있으므로 주의를 요해야 한다.

SELECT문으로 먼저 대상을 조회해 본 후 실행하는 것을 권장한다.

 

우선은 위 결과를 되돌리기 위해 아래 쿼리문을 실행하자.

 

ROLLBACK; -- 실행한 INSERT, UPDATE, DELETE 내용을 되돌리는 명령어

SELECT * FROM TB_DEPT2;

dml5_q3

 

다시 데이터가 복구된 것을 확인했으면 아래 요구사항을 읽고 해결 방법을 생각해 보자.

SALES 부서(DNAME)의 지역(LOC)을 'SEOUL'로 변경해 주세요.

 

그렇다면 아래의 쿼리들이 유효할 것이다.

UPDATE TB_DEPT2
   SET LOC = 'SEOUL'
 WHERE LOC = 'CHICAGO';
 
 UPDATE TB_DEPT2
    SET LOC = 'SEOUL'
  WHERE DEPTNO = '30';
  
 UPDATE TB_DEPT2
    SET LOC = 'SEOUL'
  WHERE DNAME = 'SALES';

dml5_q4

이렇게 원하는 결과값을 얻게 되었다. 그러나 이 쿼리들에는 함정이 있다.

 

만약 지역이 CHICAGO은 부서가 여럿이었다면?

만약 SALES 부서가 다른 지역에도 존재했다면?

만약 부서 번호(DEPTNO)가 중복이 가능한 상황이라면?

 

즉 위의 쿼리들은 우리가 가진 데이터 레코드가 저 4개뿐일 때만 유효할 수도 있는 위험한 쿼리문이 되는 것이다.

UPDATE나 DELETE 쿼리문을 작성할 때는 WHERE 뒤에 들어가는 조건이 반드시 명확하여야 하고, 되도록이면 데이터 레코드들 사이에서 유일한 값만을 가지는 열을 선정하여 조건을 작성하는 것이 권장된다.

반응형