네이버클라우드 캠프 5기/학습내용 정리

18. ORACLE - Constraint

박세류 2023. 5. 2. 09:56

1. 제약조건(Constraint)

1. 제약조건이란

  1. 제약조건은 테이블에 저장할 데이터를 제한하는 특수한 규칙. 제약조건이 걸려있는 컬럼에는 조건에 맞지 않는 데이터는 저장할 수가 없다.
  2. 제약조건은 데이터베이스의 데이터들의 정확성과 무결성을 보장해준다. DML(INSERT, DELETE, UPDATE)을 사용했을 때 잘못된 트랜잭션이 수행되지 않도록 결함을 유발시켜서 작업을 방지.
  3. PK(Primary Key), FK(Foreign Key)가 RDB(관계형 데이터베이스)의 근간이라고도 볼 수 있는 제약조건이다.
  4. 모든 테이블들은 PK를 생성해서 식별자 역할을 하게 해줘야하고 FK를 통해서 테이블간의 관계를 맺어줘야 한다.
  5. PK, FK, UK(Unique Key), NOT NULL, CHECK, DEFAULT 등의 제약조건이 존재한다.
  6. 데이터의 무결성
    • 데이터의 정확성과 일관성을 보장한다는 의미
    • 영역 무결성 : 열에 저장되는 데이터의 값이 적정한지 아닌지를 판단, 데이터 타입, 길이, NULL 여부 등을 확인
    • 개체 무결성 : 테이블 데이터를 유일하게 식별할 수 있는 기본키(PK)의 값이 있는지 NULL이 아닌지 중복이 됐는지 등을 판단
    • 참조 무결성 : 참조키(FK)가 참조해온 테이블에 기본키(PK), UK로 설정되어 있는지 참조해온 테이블에 저장되어 있는 데이터의 값인지 판단

2. Primary Key(PK, 기본키)

  1. 기본키로 설정된 컬럼의 데이터들은 중복돼서(Unique Key)는 안되고 식별자(Index)의 역할을 하게된다. 기본키로 지정된 컬럼은 UK와 Index, NOT NULL로 자동으로 지정된다.
  2. PK 지정방식(CREATE)
    • 단일 컬럼 PK일 때
      • CREATE TABLE 테이블명(
        컬럼명1 데이터타입 [CONSTRAINT 제약조건명] PRIMARY KEY,
        컬럼명2 데이터타입,
        ....,
        컬럼명N 데이터타입
        );
      • CREATE TABLE 테이블명(
        컬럼명1 데이터타입 [CONSTRAINT 제약조건명] PRIMARY KEY,
        컬럼명2 데이터타입,
        ....,
        컬럼명N 데이터타입,
        CONSTRAINT 제약조건명 PRIMARY KEY(PK로 지정할 컬럼명)
        );
    • 다중 컬럼 PK일 때
      • CREATE TABLE 테이블명(
        컬럼명1 데이터타입 [CONSTRAINT 제약조건명] PRIMARY KEY,
        컬럼명2 데이터타입,
        ....,
        컬럼명N 데이터타입,
        CONSTRAINT 제약조건명 PRIMARY KEY(PK로 지정할 컬럼명1, PK로 지정할 컬럼명2, ..., 컬럼명N)
        );
  3. 다중 컬럼 PK
    • 다중 컬럼 PK는 PK로 지정된 모든 컬럼의 값이 중복돼야 중복으로 인식.
    • 예시로 두 개의 컬럼(CNO, SNO)이 PK로 지정되어 있으면 (1, 1)과 (1, 2)는 서로 다른 값으로 인식
    • 다중 컬럼 PK는 다중 컬럼의 쌍을 PK로 지정하는 방식이다.
    • 게시판에 다중 첨부파일을 추가할 수 있을 때 첨부파일 테이블의 구조는(게시글번호, 파일번호)가 쌍으로 묶여 PK를 구성하고 있는 형태가 돼야한다.
  4. PK 수정/추가
    • ALTER TABLE 테이블명
      ADD/MODIFY CONSTRAINT 제약조건명 PRIMARY KEY(컬럼명1 , 컬럼명2, ..., 컬럼명N)
  5. PK 삭제
    • ALTER TABLE 테이블명
      DROP CONSTRAINT 제약조건명;

3. Foreign Key(참조키, 외래)

  1. FK는 다른 테이블의 PK, UK를 참조해서 생성하는 제약조건.

  2. FK 테이블간의 관계를 생성해준다.

  3. FK의 원천 테이블이 부모테이블이 되고 FK가 생성되는 테이블이 자식테이블이 되어 테이블간의 종속관계가 형성된다.

  4. FK는 NOT NULL 제약조건을 가지며 원천테이블에 저장되어 있는 데이터들만 FK의 데이터로 저장할 수 있다.

  5. FK로 지정된 원천테이블의 데이터들은 함부로 삭제나 수정이 안된다.

  6. FK를 생성하는 방법

    • 단일 컬럼 FK
    • CREATE TABLE 테이블명 (
        컬럼1 데이터타입 CONSTRAINT 제약조건명 
        REFERENCES 참조할 테이블명 (참조할 컬럼명)
        (ON DELETE CASCADE),
        (ON UPDATE CASCADE),
        컬럼2 데이터타입,
        ....
      )
    • CREATE TABLE 테이블명 (
      컬럼1 데이터타입,
      컬럼2 데이터타입,
      ...,
      CONSTRAINT 제약조건명 FOREIGN KEY(컬럼명)
        REFERENCES 참조할 테이블명(참조할 컬럼명)
        [ON DELETE CASCADE],
        [ON UPDATE CASCADE]
      );
    • CASCADE 옵션을 추가하지 않으면 부모테이블에서 데이터 삭제나 수정이 불가능
    • 참조할 컬럼과 FK로 지정될 컬럼의 데이터타입이 동일해야한다.
    • 다중 컬럼 FK
      • CREATE TABLE 테이블명(
        컬럼1 데이터타입,
        컬럼2 데이터타입,
        ...,
        CONSTRAINT 제약조건명 FOREIGN KEY(컬럼명)
        REFERENCES 참조할 테이블명(참조할 컬럼명)
        [ON DELETE CASCADE],
        [ON UPDATE CASCADE]
        );
    • 참조할 컬럼들과 FK로 지정될 컬럼들의 데이터타입, 개수, 순서가 일치해야 한다.
  7. 실제 개발 프로젝트에서는 설계단계에서는 테이블간의 관계를 맺어주지만 물리적인 테이블을 생성할 때는 관계를 빼주는 형식으로 진행되는 프로젝트가 빈번하다. 관계를 맺으면 데이터의 수정이나 삭제가 자유롭지 않기 때문에 왠만해선 관계를 제외하고 테이블을 생성한다.

  8. FK 삭제 방법

  • ALTER TABLE 테이블명
    DROP CONSTRAINT 제약조건명;
  1. FK 관계의 종류

    • 1 : 1 : 부모테이블에서 데이터 한개만 존재(PK, UK)인 상태이고 자식테이블에서도 FK 컬럼을 PK, UK.부모테이블의 데이터도 1개이면서 그에 해당하는 자식테이블 데이터도 1개만 생성되는 관계
    • 1 : N : 부모테이블에서는 1개의 데이터만 갖고 자식테이블에서는 여러개의 데이터를 생성할 수 있는 관계. 부모테이블에서는 PK, UK로 잡혀있어야 하고 자식테이블에서는 PK,UK키가 아니어도 되고 다중컬럼 PK, UK로 잡혀 있어야 한다.
    • N: 1, N : N 관계는 테이블의 구조를 만들기도 복잡하고 이런 관계를 갖는 데이터형식도 많이 존재하지 않기 때문에 자주 사용되지 않는다.
  2. FK 추가

    • ALTER TABLE 테이블명
      ADD CONSTRAINT 제약조건명 FOREIGN KEY(컬럼명)
        REFERENCES 참조할 테이블명(참조할 컬럼명)
        [ON DELETE CASCADE]
        [ON UPDATE CASCADE];

4. Unique Key

  1. UK는 중복 데이터를 허용하지 않는 제약조건이다.
  2. PK와 다르게 NULL이 허용되고 INDEX 역할을 가지고 있지 않다.
  3. NULL은 중복하여 저장이 가능하다.
  4. UK 생성 방식
    • CREATE TABLE 테이블명(
      컬럼명1 데이터타입 CONSTRAINT 제약조건명 UNIQUE,
      컬럼명2 데이터타입,
      ...
      );
    • CREATE TABLE 테이블명(
      컬럼명1 데이터타입,
      컬럼명2 데이터타입,
      ....,
      CONSTRAINT 제약조건명 UNIQUE(컬럼명)
      );

5. CHECK

  1. CHECK는 컬럼에 저장되는 데이터의 조건을 달아주는 제약조건
    ex) SAL 3000이상만 저장되게 하고 싶을때,
    COMM 1000이상만 저장되게 하고 싶을 때
  2. CHECK로 지정된 컬럼에는 명시된 조건의 데이터만 저장 가능
  3. CHECK 지정방식
    • CREATE TABLE 테이블명(
      컬럼1 데이터타입 CONSTRAINT 제약조건명 CHECK(조건),
      컬럼2 데이터타입,
      ....
      )
    • 조건은 WHERE의 명시되는 조건과 동일하게 작성.
    • CREATE TABLE 테이블명(
      컬럼1 데이터타입 CONSTRAINT 제약조건명 CHECK(조건),
      컬럼2 데이터타입,
      ....,
      CONSTRAINT 제약조건명 CHECK(컬럼명 + 조건)
      )

6. NOT NULL

  1. NOT NULL은 NULL 값을 저장하지 못하게 막아주는 제약조건
  2. NOT NULL은 CREATE TABLE 쿼리에서 컬럼 옆에만 지정할 수 있다.
  3. PK = UK + NOT NULL + INDEX
  4. 여러 개의 컬럼에 지정 가능하다.
  5. NOT NULL 생성 방법
    • CREATE TABLE 테이블명(
        컬럼1 데이터타입 NOT NULL,
        컬럼2 데이터타입 NOT NULL,
        ....
      );

7. DEFAULT

  1. DEFAULT는 데이터가 저장될 때 특정 컬럼을 제외한 데이터들만 입력 됐을 때 제외된 컬럼이 자동으로 저장될 기본 값을 지정하는 제약조건.
  2. 데이터가 NULL로 오거나 값이 안들어왔을 때의 경우를 대비해준다.
  3. 테이블을 생성할 때 컬럼 옆에 지정할 수 있다. 여러개의 컬럼에 지정가능.
  4. DEFAULT 생성 방법
    • CREATE TABLE 테이블명 (
        컬럼1 데이터타입 DEFAULT 기본값,
        컬럼2 데이터타입 DEFAULT 기본값,
        컬럼3 데이터타입 DEFAULT 기본값,
        ....
      )

8. 제약조건이 모두 추가된 CREATE TABLE 구문

  1. CREATE TABLE 테이블명 (
     컬럼명1 데이터타입 [PK] [DEFAULT 기본값] [NOT NULL],
     컬럼명2 데이터타입 [DEFAULT 기본값] [NOT NULL],
     컬럼명3 데이터타입 [DEFAULT 기본값] [NOT NULL],
     ...,
     CONSTRAINT 제약조건명1 PRIMARY KEY(컬럼명1, 컬럼명2, ..),
     CONSTRAINT 제약조건명2 FOREIGN KEY(컬럼명1, 컬럼명2, ..)
         REFERENCES 참조할 테이블명(참조할 컬럼명1, 참조할 컬럼명2, ...)
         [ON DELETE CASCADE]
         [ON UPDATE CASCADE],
     CONSTRAINT 제약조건명3 UNIQUE(컬럼명),
     CONSTRAINT 제약조건명4 CHECK(컬럼 + 조건)
    );
728x90

'네이버클라우드 캠프 5기 > 학습내용 정리' 카테고리의 다른 글

20. ORACLE - Stored Sub Program  (0) 2023.05.02
19. ORACLE - PL_SQL  (0) 2023.05.02
17. ORACLE - Object  (0) 2023.05.02
16. ORACLE - DDL  (0) 2023.05.02
15. ORACLE - DML  (0) 2023.05.02