티스토리 뷰

Server/Database

[MySQL] CHECK 제약 조건

DUCKBAE's 2022. 6. 15. 14:16

컬럼에 배치 할 수 있는 값의 범위를 제어하는 제약 조건으로, 논리 표현식에서 값의 유효 여부를 결정한다.

 

문법

[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

symbol

  • 옵션이며, 제약조건의 이름을 명시한다.
  • 최대 길이는 64자이다.

expr

  • 제약 조건을 각 행에 대하여 TRUE 또는 UNKNOWN(Null 일 경우)으로 평가해야 하는 Bool 표현식으로 지정한다.
  • 조건이 FALSE로 평가되면 실패하고 제약 조건 위반(violation)이 발생한다.

 

특징

MySQL 5.7 에서 CHECK 제약 조건을 정의 할 수 있지만, 동작하지 않는다. 

The CHECK clause is parsed but ignored by all storage engines.

 

MySQL 8.0 에서 CHECK 제약 조건을 정의 할 수 있으며, 동작이 가능하다.

하지만, CHECK 제약 조건에 대한 제한 사항이 있다.

  • AUTO_INCREMENT 속성이 부여된 컬럼은 CHECK 제약을 사용할 수 없다.
  • Stored Function(사용자 함수) 또는 Loadable Function 에서 사용할 수 없다.
  • Stored Procedure 또는 함수 매개변수에서 사용할 수 없다.
  • 변수(system variables, user-defined variables, and stored program local variables)에 사용할 수 없다.
  • 서브 쿼리에 사용할 수 없다.

 

확인

SELECT * FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS;
or
SHOW CREATE TABLE [TABLE_NAME];

 

활용

CHECK 제약조건에 이름을 명시한 경우

student 테이블에 chk_age 이름을 가진 제약조건을 생성하였다.

만약 teacher 테이블에 chk_age 이름을 가진 제약조건을 생성할 경우에, 아래와 같은 에러가 발생한다.

  • 3822 Duplicate check constraint name 'chk_age'

따라서 테이블 별로 제약 조건 명을 다르게 해야할 필요가 있다.

CREATE TABLE student (
    age INT, 
    name CHAR(255),
    CONSTRAINT chk_age CHECK (age < 20)
);

INSERT INTO student(age, name) VALUES(10, '세영'); --SUCCESS
INSERT INTO student(age, name) VALUES(20, '철수'); --FAIL
-- FAIL 시 발생하는 에러 : (3819, Check constraint 'chk_num' is violated)

-- chk_age 제약 조건 삭제
ALTER TABLE student DROP CHECK chk_age;

 

CHECK 제약조건에 이름을 명시하지 않은 경우

MySQL에서 제약조건에 이름을 부여해준다.

-- 방법 1.
CREATE TABLE student (
    age INT CHECK (age < 20), 
    name CHAR(255)
);

-- 방법 2.
CREATE TABLE student (
    age INT, 
    name CHAR(255)
    CHECK (age < 20)
)

INSERT INTO teacher(age, name) VALUES(10, '세영'); --SUCCESS
INSERT INTO teacher(age, name) VALUES(20, '철수'); --FAIL
-- FAIL 시 발생하는 에러 : (3819, Check constraint 'teacher_chk_1' is violated)

-- teacher_chk_1 제약 조건 삭제
ALTER TABLE teacher DROP CHECK teacher_chk_1;

 

참고

https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html

 

MySQL :: MySQL 8.0 Reference Manual :: 13.1.20.6 CHECK Constraints

13.1.20.6 CHECK Constraints Prior to MySQL 8.0.16, CREATE TABLE permits only the following limited version of table CHECK constraint syntax, which is parsed and ignored: CHECK (expr) As of MySQL 8.0.16, CREATE TABLE permits the core features of table and

dev.mysql.com

 

'Server > Database' 카테고리의 다른 글

NoSQL 에 대해서  (0) 2024.12.11
[MySQL] 옵티마이저  (0) 2022.11.01
[MySQL] View Table  (0) 2022.07.28
[MySQL] LOAD DATA  (0) 2022.07.28
[MySQL] 트랜잭션  (0) 2022.06.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함