[Database] 제약조건의 종류와 데이터의 삽입, 삭제, 수정 시 여러 가지 제약조건의 수행에 대해 알아보자

    무결성 제약조건 

    데이터베이스에 저장된 데이터는 결함이 없어야 하며 질의에 대해 신뢰성 있는 답을 제공해야 한다. 그래서 데이터를 저장하는 데 있어서 데이터베이스는 일관성을 유지하고 중복을 제거하는 등 데이터의 신뢰도를 유지해야 한다. 따라서 데이터의 삽입, 삭제, 수정 시 여러 가지 제약조건이 따른다. 

    데이터 무결성(integrity)은 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말한다. 일관성과 정확성을 잃어버린 데이터베이스는 정보로서의 가치에 심각한 문제가 있는 것이다. 일관성과 정확성을 가지고 구축된 데이터베이스가 계속해서 무결성을 유지하려면 투플의 삽입, 삭제, 수정 시 데이터의 제약조건 준수 여부를 확인하여야 한다. 데이터의 삽입, 삭제, 수정 시 필요한 기본적인 제약조건을 DBMS가 알아서 지켜준다면 프로그래머는 데이터 변동에 따른 대응에 필요이상의 시간을 투자하지 않고 프로그래밍에 집중할 수 있고, 소프트웨어의 성능 및 데이터의 신뢰성 향상에도 큰 도움을 줄 수 있다.

    무결성 제약조건은 투플에 삽입 가능한 데이터의 값을 제한하는 도메인 무결성 제약조건과 관계 데이터모델의 핵심인 관계 표현을 위한 개체 무결성 제약조건, 참조 무결성 제약조건이 있다.



    도메인 무결성 제약조건(domain integrity constraint)
    도메인 무결성 제약조건은 도메인 제약이라고도 하며, 릴레이션 내의 투플들이 각 속성의 도메인에 지정된 값만을 가져야 한다는 조건이다. 
    도메인 무결성 제약조건은 속성 값과 관련된 무결성으로, SQL 문에서 데이터 형식(type), 널(null/not null), 기본 값(default), 체크(check) 등을 사용하여 지정할 수 있다. 일반적으로 프로그래밍 언어의 변수형 선언과 개념이 유사하다.


    개체 무결성 제약조건(entity integrity constraint)
    개체 무결성 제약조건은 기본키 제약(primary constraint)이라고도 한다. 릴레이션은 기본키를 지정하고 그에 따른 무결설 원칙 즉, 기본키는 NULL값을 가져서는 안 되며 릴레이션 내에 오직 하나의 값만 존재해야 한다는 조건이다. 


    참조 무결성 제약조건(referential integrity constraint)

    참조 무결성 제약조건은 외래키 제약(foreign key constraint)이라고도 한다. 릴레이션 간의 참조 관계를 선언하는 제약조건이다. 부모 릴레이션(기본키가 참조되는 릴레이션)과 자식 릴레이션(기본키를 참조하는 릴레이션)의 관계에서 참조 물결성 제약조건은 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야 하며, 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받는다는 것이다. 즉 부모 릴레이션의 도메인과 다른 값으로 삽입, 수정될 때 거부되고, 반대로 자식 릴레이션에서 참조하고 있는 값을 부모 릴레이션에서 삭제하거나 다른 값으로 변경하려고 하면 거부된다.


    [각 제약조건의 정리]




    무결성 제약조건의 수행

    릴레이션은 데이터의 변경이 일어날 때 제약조건에 위배될 수 있다. 따라서 제약조건의 준수여부는 데이터의 변경(삽입, 수정, 삭제)이 있을 때마다 확인해야 한다. 예를 들어 기존의 기본키와 같은 값을 가진 투플을 삽입하거나, 기존의 기본키 값을 다른 투플의 기본키와 같은 값으로 변경한다면 그 연산은 거부된다. 또 부모 릴레이션에서 투플을 삭제할 경우 자식 릴레이션도 같이 처리를 해햐 한다.


    다음 각각의 제약조건에서 데이터의 변경이 일어날 때 어떻게 수행되는지 알아보자

     

    개체 무결성 제약조건

    관계 데이터베이스 시스템에서 DBMS는 투플을 삽입하거나 수정할 떄마다 개체 무결성 제약조건을 지키는지 확인한다. 즉 기본키 값이 유일한지 NULL값이 아닌지를 검사한다. 만약 조건에 맞지 않으면 삽입 연산을 거부하고 오류 메시지를 보낸다. 다음 예제를 보면서 삽입 수행 오류를 보자


    학생 릴레이션에 투플 (501, 남슬찬, 1001)을 삽입하려고 했다. 하지만 학번 501이 이미 있다는것은 발견하고 삽입을 거부한다. 그리고 학번이 NULL인 투플을 삽입하려고 할때 투플을 검색할 필요도 없이 거부한다. 이것이 개체 무결성 제약조건의 수행이다. 


    수정 수행도 마찬가지로 삽입 연산과 동일한 제약에 따라 처리한다. 만약 학번 501을 502로 바꾸려고 할 때 DBMS는 동일한 값이 존재하는지 검색한 후 수정을 거부한다.


    삭제 수행은 특별한 확인이 필요하지 않으며 즉시 수행된다. 단 참조 무결성 제약조건에 의하여 학생 릴레이션의 기본키를 다른 릴레이션에서 외래키로 참조하고 있으면 바로 삭제하지 않는다. 



    참조 무결성 제약조건

    참조 무결성 제약조건은 부모 릴레이션과 자식 릴레이션 관계에서 수행된다. 위 코드에서 학생 릴레이션이 학과 릴레이션의 학과코드를 참조한다고 했을 때 학생 릴레이션은 자식 릴레이션이 되고 반대로 학과 릴레이션은 부모 릴레이션이 된다. 


    학생 릴레이션에 새로운 투플을 삽입하려고 했을 때 DBMS는 먼저 도메인 무결성 제약조건을 확인한 후 개체 무결성 제약조건에 위배되는 값이 없는지 확인한다. 그리고 나서 학과코드 값이 학과 릴레이션의 기본키에 존재하는지 확인한다. 학생 릴레이션에 투플 (601, 박세리, 3001)을 삽입하려고 했을 때 학번 601은 들어갈 수 있지만 학과코드 3001은 들어갈 수 가 없으므로 수행이 거부된다. 만약 참조하는 학과코드가 NULL값을 허용 했다면 (601, 박세리, NULL) 값을 넣어 수행할 수는 있다. 


    삭제 수행은 삽입과는 반대로 자식 릴레이션에서 투플이 삭제될 때 부모 릴레이션에는 아무런 영향을 주지 않으므로 바로 삭제가 가능하다. 그러나 부모 릴레이션에서 투플이 삭제되는 경우에는 문제가 발생할 수 있다. 만약 부모 릴레이션에서 학과코드 1001인 투플을 삭제하려고 했을 때 자식 릴레이션에서 이 학과코드 1001을 참조하고 있는 투플이 있는지를 확인한다. 이 경우 문제가 생기며 4가지 조치가 있다.

    • 즉시 작업을 중지(RESTRICTED)

    • 자식 릴레이션의 관련 투플을 삭제(CASCADE)

    • 초기에 설정된 다른 어떤 값으로 변경(DEFAULT)

    • NULL 값으로 설정(NULL)

    이와 같이 DBMS는 부모 릴레이션에서 투플을 삭제할 떄 참조 무결성 제약조건을 수행하기 위한 4가지 옵션이 있다. 이는 제약조건 선언 시 자식 릴레이션에도 지정해주어야 한다.


    [참조 무결성 제약조건의 옵션(부모 릴레이션에서 투플을 삭제할 경우)]


    수정은 삭제와 삽입 명령이 연속해서 수행된다고 보면 된다. 부모 릴레이션의 수정이 일어날 때 삭제 옵션에 따라 처리된 ㄷ후 문제가 없으면 다시 삽입 제약조건에 따라 처리된다. 



    출처 : 오라클로 배우는 데이터베이스 개론과 실습 / 한빛 아카데미

    댓글

    Designed by JB FACTORY