2011년 7월 7일 목요일

[Oracle.7]DML (Data Manipulation Language) - Constraints

DML ( Data Manipulation Language )
테이블의 데이터는 조회 및 추가, 수정, 삭제할 수 있어야 한다. DML은 이와 관련된 명령어를 부르는 용어로 데이터 조작 명령을 통해 테이블 내 데이터를 추가, 수정, 삭제 할 수 있다.
2. Constraints
Constraints란 말 그래도 테이블에 추가, 변경, 삭제되는 데이터를 제약하고자 하는 것이다.
데이터의 Integrity를 유지하기 위해 사용되며, Integrity란 데이터의 결함이 없는 것을 말한다.예를 들어 사원번호라 함은 값이 꼭 할당 되어야 하며, 중복되지 않아야 데이터의 결함이 발생하지 않게된다. Oracle은 이러한 제약을 KEY가 가지는 요건을 만족하는 데이터만을 칼럼에 저장하며, 그 외 값을 받아들이지 않는다. 그러면 이러한 KEY에 대해 살펴 보자.
1) NOT NULL
NOT NULL NULL을 허용하지 않으므로 반드시 입력되어야 한다. NOT NULL로 제약조건을 설정하면 데이터베이스에서는 해당 칼럼에 NULL 값이 추가되거나 NULL 값으로 변경되면 에러를 발생시킨다.
2) UNIQUE
UNIQUE 제약 조건은 칼럼에 중복된 값을 허용하지 않는다. 즉 유일한 하나의 값만 저장될 수 있다.
3) PRIMARY KEY
위의 두 가지 사항 ( NOT NULL UNIQUE ) 을 모두 만족해야 하는 것이 PRIMARY KEY이다. PRIMARY KEY는 주로 사원 테이블의 사원번호나 부서 테이블의 부서번호와 같이 유일하게 행을 식별하는 식별 자로서 역할을 하는 칼럼에 적용이 된다.
4) FOREIGN KEY
FOREIGN KEY는 의미에서 보듯 외국, 외래의 의미가 담겨 있다. 예를 들어 새로 들어온 사원을 입력할 때 부서번호는 현존 부서의 번호 이여야 한다. 즉 현존하는 부서번호가 아닌 값을 입력 받는다면 그 사람은 현재 존재하지 않는 부서에 속해있는 사람이 되어 데이터에 결함을 가지게 된다. 이를 방지하기 위해 사원 테이블의 부서번호 칼럼에 FOREIGN KEY를 설정하면 값이 입력,변경 될 때 부서 테이블의 주 식별자인 부서번호를 참고하여 부서번호가 존재할 때 사원 테이블 부서번호 칼럼에 값을 받아들일 수 있도록 해 준다.
삭제를 진행할 때에도 부서가 먼저 삭제되면 사원은 부서가 없어지게 되어 데이터의 결함이 발생하므로 FOREIGN KEY로 연결된 사원 데이터 먼저 삭제하고 부서를 삭제해야 한다.
5) CHECK
CHECK 제약조건은 입력되는 값을 체크하여 설정된 값 이외의 값은 받아들이지 않도록 한다. 예를 들어 SALARY > 0 조건을 설정하면 SALARY가 음수인 경우 받아 들이지 않는다.
제약조건
표기
설명
UNIQUE
UK
중복된 값을 허용하지 않습니다.
NOT NULL
NN
NULL 값을 허용하지 않습니다.
PRIMARY KEY
PK
UNIQUE NOT NULL의 조건을 만족하는 값을 허용합니다.
FOREIGN KEY
FK
참조하는 테이블의 칼럼의 값이 존재하면 값을 허용합니다.
CHECK
CK
제약조건을 설정할 때 설정한 값만을 받아들입니다.
6) MERGE
MERGE란 하나 혹은 그 이상의 테이블에 대한 INSERT, UPDATE 작업을 위해 하나 혹은 그 이상의 소스로부터 질의할 때 사용하는 명령어 이다. 이 명령어는 여러 개의 동작을 조합하여 실행할 때 유용하며, 여러 번의 INSERT, UPDATE, DELETE 작업을 피할 수 있는 방법이 된다.
MERGE INTO 테이블이름
USING SELECT 구문
ON 조건
WHEN MATCHED THEN
       UPDATE 구문
       [DELETE 구문]
WHEN NOT MATCHED THEN
       INSERT 구문
[WHERE ];
SQL > MERGE INTO bonuses b
      USING (SELECT employee_id, salary, department_id FROM employees ) e
      ON ( e.employee_id = b.employee_id )
   
      WHEN MATCHED THEN
            UPDATE SET bonus = bonus + salary * 0.1
            DELETE WHERE salary > 8000
      WHEN NOT MATCHED THEN
            INSERT VALUES ( e.employee_id, salary * 0.1 )
            WHERE salary <= 8000;
7) LOCK
DML 작업을 수행하기 위해서 테이블에 질의를 수행하고 데이터를 조작한다. 이때 테이블에 발생하는 Transaction은 먼저 수행한 세션에서 Transaction을 종료하지 않으면 그 이후 같은 행에 대해 이루어지는 Transaction에 대해 LOCK이 발생한다.
이러한 LOCK은 동시에 여러 사용자가 접속해서 사용하는 데이터베이스 환경에서는 제공되어야 하나 Waiting으로 인한 처리 속도의 저하가 문제가 될 수 있다. 따라서 긴 Transaction은 사용자의 사용이 적은 시간대를 선택하여 작업하며, 가능한 한 짧게 Transaction을 수행하는 것이Waiting을 최소화할 수 있는 방법이 될 수 있다. 

*** 참조 문헌 : 10g로 시작하는 오라클 SQL & PL/SQL - 5장 데이터조작의 장애를 제거하라

댓글 없음:

댓글 쓰기

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...