데이터 조작

Oracle/OracleDB_SQL 2016. 5. 24. 20:21

데이터 조작


** DML (데이터 조작어)

** DML문은 밑의 3가지 경우에 실행된다.


- 테이블의 새 행 추가

- 테이블의 기존 행 추가

- 테이블에서 기존 행 제거


** 트랜잭션은 논리적 작업 단위를 형성하는 DML문의 모음으로 구성된다.


[INSERT로 테이블에 행 추가하기]

- INSERT INTO table [(column [, column...] ) ]

  VALUES        [, value...] ) ;


table : 테이블의 이름

column  : 테이블에 채울 열의 이름이다.

value : 열의 해당 값이다.


- 테이블에 있는 열의 기본 순서로 값을 나열한다.

- 문자와 날짜 값은 작은 따옴표로 묶는다.



[NULL 값을 가진 행 삽입]

- 암시적 방법 : 열 리스트에서 열을 생략한다.

- 명시적 방법 : VALUES 절에서 NULL 키워드를 지정한다.



[다른 테이블에서 행 복사하기]

- INSERT문을 subquery로 작성한다.

- VALUES 절을 사용하지 않는다.

- INSERT 절의 열 개수를 subquery의 열 개수와 일치시킨다.




[테이블의 데이터 변경하기]


UPDATE문을 사용해서 테이블의 기존의 값을 수정할 수 있다.


UPDATE        table

SET              column = value [ , column = value, ....  ]

[WHERE        condition ] ;


table : 테이블의 이름

column : 테이블에 채울 열의 이름

value : 열의 해당 값 또는 subquery이다.

condition : 갱신할 행을 식별하며 열 이름, 표현식, 상수, subquery 및 비교 연산자로 구성된다.

** 갱신할 단일 행을 식별하려면, 일반적으로 WHERE 절에 primary Key열을 사용한다.


subquery를 사용해서 여러 열을 갱신할 수도 있다.

UPDATE         table

SET                column =   (SELECT column

FROM    table

     WHERE condition)

[ , column = ( SELECT     column

FROM      table

WHERE    condition ) ]

[ WHERE condition ] ;



[테이블에서 행 제거 ]

- DELETE 문

DELETE [FROM]    table

[WHERE              condition] ;


- TRUNCATE 문

* 테이블은 빈 상태로, 테이블 구조는 그대로 남겨둔채로 테이블에서 모든 행을 제거

* DML 문이 아니라 DDL(데이터 정의어) 문이기 떄문에 쉽게 언두할 수 없다.


TRUCATE    TABLE    table_name;


TRUNCATE 문을 사용하면  DELETE보다 제거하는 방법이 빠르고 신속하다.

- DDL문이며 rollback정보를 생성하지 않는다.

- 테이블의 삭제 트리거를 유발하지 않는다.

** 테이블이 참조 무결성 제약 조건의 상위 요소인 경우에는 TRUNCATE를 할 수없다.

** TRUNCATE 하기 전에 제약 조건을 비활성화해야 한다.






[COMMIT, ROLLBACK, SAVEPOINT를 사용하여 DB 트랜잭션 제어]


데이터 베이스 트랙잭션

- 데이터를 일관되게 변경하는 여러 DML문

- 하나의 DDL 문

- 하나의 DCL (데이터 제어어) 문


Transaction이란??


데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다.

여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며,

일관되고 믿을 수 있는 시스템을 의미한다.

이론적으로 데이터베이스 시스템은 각각의 트랜잭션에 대해서 

원자성, 일관성, 고립성, 영구성을 보장한다.

그러나, 실제로는 성능향상을 위해서 이런 특성들이 종종 완화되곤 한다.

어떤 시스템에서는 트랙잭션들은 논리적 작업 단위(LUW, Logical Units of Work)로 불린다.

[출처 : 위치백과


트랜잭션은 데이터를 변경할 떄 많은 유연성과 제어 기능을 제공하며 유저 프로세스 실패 

또는 시스템 실패 시 데이터 일관성을 보장한다.


[트랜잭션이란 도대체 뭐란 말인가!]

http://egloos.zum.com/springmvc/v/495798 블로거님의 글도 참고




데이터베이스 트랜잭션 : 시작과 종료

- 첫번째 DML SQL문이 실행될 떄 시작된다.

- 다음 상황 중 하나가 발생하면 종료된다.

  * COMMIT 또는 ROLLBACK 문 실행

  * DDL 또는 DCL 문 실행(자동 커밋)

  * 유저가 Tool (SQL Developer or SQL*PLUS)을 종료하면

  * 시스템 중단


COMMIT 및 ROLLBACK 문의 이점

- 데이터 일관성 보장

- 변경 사항을 영구 적용하기 전에 데이터 변경 사항 검토

- 논리적으로 관련된 작업 그룹화


명시적 Transaction


COMMIT 

- 보류 중인 모든 데이터 변경 사항을 영구적으로 적용하여 현재 Transaction을 종료한다.

SAVEPOINT name

- 현재  Transaction 내에 저장점을 표시한다.

ROLLBACK

- 보류 중인 모든 데이터 변경사항을 폐기하여 현재 Transaction을 종료한다.

ROLLBACK TO SAVEPOINT name

- 현재 Transaction을 지정된 저장점으로 롤백한다.

- ROLLBACK 중인 저장점 이후에 생성된 변경 사항 및 저장점은 폐기됨



암시적 Transaction 처리


자동커밋이 발생하는 상황

- DDL문이 실행될 때

- DCL문이 실행될 때

- COMMIT 또는 ROLLBACK 문을 명시적으로 실행하지 않은 채 Tool이 정상적으로 종료된 경우


SQL Developer 또는 SQL * PLUS가 비정상적으로 종료되거나 시스템 failure가 발생된 경우에는

자동 롤백이 발생한다.



COMMIT 또는 ROLLBACK 전의 데이터 상태


- 이전의 데이터 상태를 복구할 수 있다.

- 현재 유저는 SELECT문을 사용하여 DML 작업의 결과를 확인할 수 있다.

- 다른 유저는 현재 유저가 실행한 DML 문의 결과를 볼 수 없다.

  (Oracle서버는 읽기 일관성을 제공하여 각 유저가 마지막 커밋된 시점의 상태대로 데이터를 

  볼 수 있도록 보장한다. )

- 영향을 받는 행이 Lock 다른 유저가 받는 행의 데이터를 변경할 수 없다.



COMMIT 후의 데이터 상태

- 데이터 변경 사항이 데이터베이스에 저장된다.

- 이전의 데이터 상태를 겹쳐쓴다.

- 모든 유저가 결과를 확인할 수 있다.

- 영향을 받는 행의 Lock이 해제되어서 이러한 행을 다른 유저가 조작할 수 있다.

- 모든 저장점이 지워진다.


ROLLBACK 후의 데이터 상태


- 데이터 변경 사항이 실행 취소된다.

- 이전의 데이터 상태가 복원된다.

- 영향 받는 행의 잠금이 Unlock




[명령문 레밸 롤백]


- 단일 DML 문을 실행하는 중에 오류가 발생하면 해당 명령문만 롤백된다.

- Oracle 서버는 저장점을 암시적으로 구현한다.

- 다른 모든 변경 사항은 보존된다.

- Oracle 서버는 DDL문을 실행하기 전과 실행한 후에 암시적 커밋을 실행한다.

  DDL문이 성공적으로 실행되지 않더라도 서버가 이미 커밋을 실행했기 때문에

  이전 명령문을 롤백할 수 없다.

- 유저는 COMMIT 또는 ROLLBACK을 실행하여 Transaction을 명시적으로 종료해야 한다.



읽기 일관성


- 데이터에 대한 일관성 있는 뷰를 보장한다.

- 한 유저가 변경한 사항이 다른 유저가 변경한 사항과 충돌하지 않는다.

- 읽기 일관성은 동일한 데이터에 다음 사항을 보장한다.

  1. 읽는 사람은 쓰는 사람의 작업이 완료되기를 기다릴 필요가 없다.

  2. 쓰는 사람은 읽는 사람의 작업이 완료되기를 기다릴 필요가 없다.

  3. 쓰는 사람은 다른 쓰는 사람의 작업이 완료되기를 기다려야한다.



읽기 일관성을 유지할 경우, 다음과 같은 효과

- 데이터 베이스 기록자와 읽는 사람이 일관된 데이터 뷰를 볼 수 있다.

- 현재 변경 중인 데이터는 읽는 사람이 볼 수 없다.

- 쓰는 사람은 데이터베이스 변경 작업을 일관되게 수행할 수 있다.

- 쓰는 사람이 변경한 데이터는 다른 쓰는 사람이 변경하는 사항과 충돌하지 않는다.


읽기 일관성의 목적

- 유저가 DML 작업을 시작하기 전 마지막 커밋 시점의 상태대로 데이터를 볼 수 있도록

  보장하는 것이다.


** 읽기 일관성은 자동으로 구현이된다.


SELECT문의 FOR UPDATE 절


.....................................................................



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

role 비활성화  (0) 2016.05.26
테이블 생성, 관리 (DDL 문 이용)  (0) 2016.05.25
오라클 nls_character  (0) 2016.05.24
단일 행 함수  (0) 2016.05.21
데이터 제한 및 정렬  (0) 2016.05.21
admin