ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - 제약 조건
    DataBase/Oracle 2023. 9. 5. 11:34

     

    1. 제약조건의 종류

     

    1.1 제약조건이란?

     

    - 오라클에서 제약 조건은 테이블의 특정 열에 지정

    - 제약 조건을 지정한 열에 제약 조건에 부합하지 않는 데이터를 저장할 수 없다.

    - 제약 조건 지정 방식에 따라 기존 데이터의 수정 혹은 삭제 가능 여부도 영향을 받는다.

     

    NOT NULL  지정한 열에 NULL 허용 X (데이터 중복 허용)
    UNIQUE  지정한 열이 유일한 값을 가져야 합니다. (중복될 수 없다) NULL 가능
    PRIMARY KEY  지정한 열이 유일한 값, NULL x, 테이블에 하나만 지정
    FOREIGN KEY  다른 테이블의 열을 참조하여 존재하는 값만 입력할 수 있다.
    CHECK  설정한 조건식을 만족하는 데이터만 입력 가능

     

    * 데이터 무결성이란?

      데이터베이스에 저장되는 데이터의 정확성과 일관성 보장 

    영역 무결성 열에 저장되는 값 적정 여부 확인, 정해 놓은 범위 만족하는 데이터임을 규정
    개체 무결성 테이블에 데이터를 유일하게 식별할 수 있는 기본키는 반드시 값을 가져야하며 null과 중복x
    참조 무결성 참조 테이블의 외래키 값은 참조 테이블의 키본키로서 존재해야하며, null 가능 

    위와 같은 제약 조건은 설계 시점에 주로 지정한다. 물론 추가,변경,삭제 가능 -> DDL을 통해 활용 

     

    2. 빈값을 허락하지 않는 NOT NULL

     

    - 열에 데이터 중복 여부와는 상관없이 NULL의 저장을 허용하지 않는 제약 조건이다.

    - 반드시 열값이 존재해야하는 경우 사용한다. 

    - NOT NULL을 지정하면 UPDATE문을 사용하여 열 값을 NULL로 수정하는 것도 불가능 합니다. 

     

    CREATE TABLE TABEL_NOTNULL(
    	LOGIN_ID VARCHAR(20) NOT NULL,
        LOGIN_PWD VARCHAR(20) NOT NULL,
        TEL VARCHAR2 (20)
    );

     

    2.1 제약조건 확인하기 

     

    - USER_CONSTRAINTS데이터 사전을 통해 확인 가능 

    SELECT OWER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
    FROM USER_CONSTRAINTS;

     

    2.2 제약 조건 이름 지정하기 

     

    - 이름을 직접 지정하지 않으면, 알아서 제약조건 명이 생성됨 

    CREATE TABLE TABEL_NOTNULL(
    	LOGIN_ID VARCHAR(20) CONSTRAINT TBLNN2_LGNID_NN NOT NULL,
        LOGIN_PWD VARCHAR(20) CONSTRAINT TBLNN2_LGNPW_NN  NOT NULL ,
        TEL VARCHAR2 (20)
    );

     * NOT NULL같은 경우에는 제약조건명을 딱히 지정하지 않음 

     

    2.3 이미 생성한 테이블에 제약조건 지정 

     

    - MODIFY키워드를 사용

    ALTER TABLE TABLE_NOTNULL MODIFY (TEL NOT NULL);
    ALTER TABLE TABLE_NOTNULL MODIFY (TEL TBLNN_TEL_NN NOT NULL);

    - 제약조건 명만 변경하기 

    ALTER TABLE TABLE_NOTNULL2
    RENAME CONSTRAINT TBLNN_TEL_NN TO TBLNN2_TEL_NN;

     

    2.4 제약 조건 삭제 

    ALTER TABLE TABLE_NOTNULL2
    DROP CONSTRAINT TBLNN2_TEL_NN;

     

    3. 중복되지 않는 값 UNIQUE

     

    - 열에 저장할 데이터의 중복을 허용하지 않고 싶을 때 사용합니다. NULL값은 가능 

    - 지정방법은 NOT NULL과 동일함 

    CREATE TABLE TABEL_NOTNULL(
    	LOGIN_ID VARCHAR(20) UNIQUE,
        LOGIN_PWD VARCHAR(20) NOT NULL,
        TEL VARCHAR2 (20)
    );

     

    4. 유일한 값 PRIMARY KEY

     

    - UNIQUE와 NOT NULL제약 조건의 특성을 모두 가짐 

    - 테이블에 하나만 지정해야한다. 또한 특정 열을 PRIMARY KEY로 지정하면 자동으로 인덱스가 만들어진다.

     

    CREATE TABLE TABEL_NOTNULL(
    	LOGIN_ID VARCHAR(20) PRIMARY KEY,
        LOGIN_PWD VARCHAR(20) NOT NULL,
        TEL VARCHAR2 (20)
    );

     

    * CREATE문에서 제약조건 지정하는 다른 방식 

    - 인라인,열레벨 제약조건은 위에서 제약조건을 명시했던 것과 일치

    - 아웃라인,테이블 레벨 제약 조건은 아래와 같음 

    CREATE TABLE TABLE_NAME(
    
    	열이름 타입
        
        PRIMARY KEY(COL1), -- 제약조건 이름을 지정 x
        CONSTRAINT CONSTRAINT_NAME UNIQUE(COL2) -- 제약조건 이름 지정 
    
    )

     

    5. 다른 테이블과 관계를 맺는 FOREIGN KEY

     

    - 서로 다른 테이블 간 관계를 정의하는데 사용

    - 특정 테이블에서 PRIMARY KEY 제약 조건을 지정한 열을 다른 테이블의 특정 열에서 참조하겠다는 의미 

    - 참조 대상 테이블을 부모, 참조하는 테이블을 자식이라고 함 

    - 부모테이블 기본키열에 없는 값을 자식 테이블 외래키에서 사용하려고 하면 에러 발생한다.

     

    INSERT INTO EMP(DEPTNO) VALUES (50);
    --DEPTNO는 DEPT에 기본키이자 EMP의 외래키, DEPT DEPTNO에 없는 값을 EMP에서 참조하려고 하면 안됨

     

    5.1 FOREIGN KEY 지정하기 

     

    CREATE TABLE 테이블 명(
        --인라인
    	열이름 열자료형 CONSTRAINT [제약조건명] REFERENCES 참조테이블 (참조할 열)
        --아웃라인
        CONSTRAINT [제약조건명] FOREIGN KEY(열) REFERENCES 참조테이블 (참조할 열)
    )

     

    5.2 FOREIGN KEY로 참조 행 데이터 삭제하기 

    DELETE FROM DEPT_FK --참조테이블
    WHERE DEPTNO = 10;
    
    -- 참조하는 자식 테이블이 DEPT_FK의 DEPTNO = 10 값 참조 중 따라서 삭제 불가

     

    - 기본키 가진 테이블에서 기본키 특정 열값을 삭제하기 위해서는

       1. 현재 삭제하려는 열 값을 참조하는 데이터 먼저 삭제

       2. 현재 삭제하려는 열 값 참조하는 데이터 수정

       3. 자식테이블에서 FOREIGN KEY 제약조건 해제 

     

    ** 회원(PK) -  주문(FK) -> 주문이 회원 PK를 FK로 사용하느냐 아니냐에 따라 식별, 비식별 관계   

       일부로 위와 같은 관계를 만들기도 한다. 

     

    - 열 데이터 삭제시 이 데이터 참조하고 있는 데이터 삭제 

    CONSTRAINT [제약조건명] REFERENCES 참조테이블(참조할 열) ON DELETE CASCADE

    - 열 데이터 삭제시 이 데이터 참조하는 데이터 NULL로 수정 

    CONSTRAINT [제약조건명] REFERENCES 참조테이블(참조할 열) ON SET NULL

    * 두개의 차이점은 DELETE CASCADE시 참조하는 열의 모든 데이터(행 자체)삭제

       NULL은 그 열의 값만 NULL로 변경함 

     

     

    6. 데이터 형태와 범위 정하는 CHECK

     

    - 열에 저장할 수 있는 값의 범위 또는 패턴을 정의할 때 사용합니다.

     

    CREATE TABLE TABLE_CHECK(
    
    	열이름 테이터형 CONSTRAINT [제약조건명] CHECK (값의 범위 ex LENGTH(열)>3)
    )

      

    7. 기본값을 정하는 DEFAULT 

     

    - 제약조건과 별개로 특정 열에 값이 지정되지 않았을 경우 기본값 지정 

     

    CREATE TABLE TABLE_DEFAULT(
    
    	열이름 데이터형 DEFAULT '1234'
    );

     

     

    ** 제약 조건 비활성화, 활성화 

     

    - 제약조건은 필요하지만 종종 거슬림 (테스트나, 신규개발 등등에서) 따라서 지정된 제약조건을 키고 끌 수 있다.

     

    ALTER TABLE 테이블 명 
    DISABLE [NOVALIDATE/VALIDATE (선택)] CONSTRAINT 제약조건명
    
    -- ENABLE [NOVALIDATE/VALIDATE (선택)] CONSTRAINT 제약조건명

     

     

     

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

    SQL 사용자,권한,롤 관리  (0) 2023.09.05
    SQL - 데이터 정의어 (DDL)  (0) 2023.09.04
    SQL - 트랜잭션 제어와 세션  (0) 2023.09.04
    SQL - DML  (0) 2023.09.01
    오라클 sql - 인라인 뷰를 사용한 TOP-N SQL  (0) 2023.09.01
Designed by Tistory.