SQL Check
SQL CHECK: 값의 조건을 검증하는 제약 조건
SQL CHECK 제약 조건은 테이블의 특정 열에 입력되는 값이 특정 조건을 만족하도록 제한하는 제약 조건입니다. CHECK 제약 조건을 설정하면, 데이터가 테이블에 삽입되거나 수정될 때 지정한 조건을 만족하지 않으면 오류가 발생하여 해당 값이 테이블에 저장되지 않습니다. 이를 통해 데이터 무결성을 유지할 수 있습니다.
1. CHECK 제약 조건의 주요 특징
- 조건 기반 유효성 검증: CHECK 제약 조건은 특정 조건을 만족하는 값만 해당 열에 저장할 수 있도록 제한합니다.
- 다양한 연산 지원: 비교 연산자 (
=
,>
,<
,<=
,>=
,<>
)나 논리 연산자 (AND
,OR
,NOT
) 등을 사용하여 다양한 조건을 설정할 수 있습니다. - 열 단위 및 테이블 단위로 설정 가능: 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
테이블에서 salary
와 department_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보다 커야 함
);
이 명령은 salary와 department_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 테이블에서 price와 quantity 열에 대한 조건을 설정하여, 가격은 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 제약 조건은 데이터베이스에서 잘못된 값이 저장되는 것을 방지하고, 데이터의 정확성과 무결성을 유지하는 데 중요한 역할을 합니다.