코딩 스쿨 SQL

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

SQL Check

SQL CHECK: 값의 조건을 검증하는 제약 조건

SQL CHECK 제약 조건은 테이블의 특정 열에 입력되는 값이 특정 조건을 만족하도록 제한하는 제약 조건입니다. CHECK 제약 조건을 설정하면, 데이터가 테이블에 삽입되거나 수정될 때 지정한 조건을 만족하지 않으면 오류가 발생하여 해당 값이 테이블에 저장되지 않습니다. 이를 통해 데이터 무결성을 유지할 수 있습니다.


1. CHECK 제약 조건의 주요 특징

  1. 조건 기반 유효성 검증: CHECK 제약 조건은 특정 조건을 만족하는 값만 해당 열에 저장할 수 있도록 제한합니다.
  2. 다양한 연산 지원: 비교 연산자 (=, >, <, <=, >=, <>)나 논리 연산자 (AND, OR, NOT) 등을 사용하여 다양한 조건을 설정할 수 있습니다.
  3. 열 단위 및 테이블 단위로 설정 가능: CHECK 제약 조건은 개별 열에 적용하거나, 테이블 전체에 적용할 수 있습니다.

2. CHECK 제약 조건 기본 문법

2.1 테이블 생성 시 CHECK 제약 조건 설정

CREATE TABLE 테이블_이름 (
    열_이름 데이터_타입 CHECK (조건)
);

  • 열_이름: 제약 조건을 설정할 열의 이름.
  • 조건: 해당 열에 저장되는 값이 만족해야 하는 조건.

2.2 테이블 생성 후 CHECK 제약 조건 추가 (ALTER TABLE)

ALTER TABLE 테이블_이름
ADD CONSTRAINT 제약조건_이름 CHECK (조건);


3. CHECK 제약 조건 예제

3.1 테이블 생성 시 CHECK 제약 조건 추가

예제: employees 테이블에서 salary가 0 이상이어야 하는 조건 설정

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2) CHECK (salary >= 0)  -- 급여는 0 이상이어야 함
);

이 명령은 employees 테이블에서 salary 열에 CHECK 제약 조건을 설정하여, 급여가 0 이상인 값만 허용하도록 합니다.

3.2 테이블 전체에 CHECK 제약 조건 추가

예제: employees 테이블에서 salarydepartment_id에 대한 조건 추가

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2),
    department_id INT,
    CHECK (salary >= 0 AND department_id > 0)  -- 급여는 0 이상, 부서 ID는 0보다 커야 함
);

이 명령은 salarydepartment_id 열에 대한 조건을 설정하여, 급여는 0 이상, 부서 ID는 0보다 큰 값만 허용합니다.


4. 테이블 생성 후 CHECK 제약 조건 추가

기존 테이블에 CHECK 제약 조건을 추가할 수 있습니다. ALTER TABLE 명령을 사용하여 조건을 추가합니다.

문법

ALTER TABLE 테이블_이름
ADD CONSTRAINT 제약조건_이름 CHECK (조건);

예제: employees 테이블의 salary에 CHECK 제약 조건 추가

ALTER TABLE employees
ADD CONSTRAINT chk_salary CHECK (salary >= 0);

이 명령은 employees 테이블의 salary 열에 chk_salary라는 이름의 CHECK 제약 조건을 추가하여, 급여가 0 이상이도록 설정합니다.


5. CHECK 제약 조건 제거

기존 테이블에서 CHECK 제약 조건을 제거할 수 있습니다. ALTER TABLE 명령을 사용하여 제거합니다.

문법

ALTER TABLE 테이블_이름
DROP CONSTRAINT 제약조건_이름;

예제: employees 테이블에서 chk_salary 제약 조건 제거

ALTER TABLE employees
DROP CONSTRAINT chk_salary;

이 명령은 employees 테이블에서 chk_salary라는 CHECK 제약 조건을 제거합니다.


6. 다양한 CHECK 제약 조건 예제

6.1 나이 제한 설정 (범위 지정)

예제: students 테이블에서 나이는 18세 이상, 60세 이하로 설정

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT CHECK (age BETWEEN 18 AND 60)  -- 나이는 18 이상, 60 이하
);

이 명령은 students 테이블에서 age 열에 CHECK 제약 조건을 설정하여, 나이가 18세 이상 60세 이하인 값만 허용하도록 합니다.

6.2 특정 열의 값 제한

예제: products 테이블에서 price는 0 이상, quantity는 1 이상으로 설정

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    price DECIMAL(10, 2),
    quantity INT,
    CHECK (price >= 0 AND quantity >= 1)  -- 가격은 0 이상, 수량은 1 이상
);

이 명령은 products 테이블에서 pricequantity 열에 대한 조건을 설정하여, 가격은 0 이상, 수량은 1 이상인 값만 허용하도록 합니다.


7. CHECK 제약 조건과 데이터 무결성

CHECK 제약 조건은 데이터를 삽입하거나 업데이트할 때 유효성 검증을 강제하여, 잘못된 값이 데이터베이스에 저장되지 않도록 데이터 무결성을 유지합니다. 예를 들어, 급여, 나이, 수량 등 논리적으로 유효한 값만 허용되도록 설정할 수 있으며, 이를 통해 데이터베이스에 잘못된 정보가 저장되는 것을 방지할 수 있습니다.


8. CHECK 제약 조건의 제한 사항

  • 일부 DBMS는 CHECK 제약 조건을 완벽하게 지원하지 않을 수 있습니다. 예를 들어, MySQL은 기본적으로 CHECK 제약 조건을 무시하는 경우가 있으므로, 이를 사용할 때는 해당 DBMS의 특성을 확인해야 합니다.
  • CHECK 제약 조건은 단일 열이나 여러 열에 대해 설정할 수 있지만, 매우 복잡한 조건을 설정할 때는 제약 조건의 평가가 성능에 영향을 미칠 수 있습니다.

9. 실전 예제

예제 1: 학생 테이블에서 나이와 성별에 대한 조건 설정

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT CHECK (age BETWEEN 18 AND 30),  -- 나이는 18세 이상, 30세 이하
    gender CHAR(1) CHECK (gender IN ('M', 'F'))  -- 성별은 M 또는 F만 허용
);

이 예제는 students 테이블에서 나이는 18세 이상 30세 이하, 성별은 M 또는 F인 값만 허용합니다.

예제 2: 기존 제품 테이블에 가격 제한 추가

ALTER TABLE products
ADD CONSTRAINT chk_price CHECK (price >= 0);

이 명령은 products 테이블에서 price가 0 이상이어야 한다는 조건을 추가합니다.


10. 요약

  • CHECK 제약 조건은 데이터가 특정 조건을 만족해야만 테이블에 삽입될 수 있도록 제한합니다.
  • 테이블 생성 시나 ALTER TABLE 명령을 통해 기존 테이블에 CHECK 제약 조건을 추가할 수 있습니다.
  • CHECK 제약 조건을 통해 숫자 범위, 값의 유효성, 논리 조건 등을 강제할 수 있으며, 이를 통해 데이터 무결성을 유지합니다.
  • 필요시 ALTER TABLE을 사용하여 CHECK 제약 조건을 제거할 수 있습니다.

CHECK 제약 조건은 데이터베이스에서 잘못된 값이 저장되는 것을 방지하고, 데이터의 정확성무결성을 유지하는 데 중요한 역할을 합니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com