티스토리 뷰
컬럼에 배치 할 수 있는 값의 범위를 제어하는 제약 조건으로, 논리 표현식에서 값의 유효 여부를 결정한다.
문법
[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
- HashSet
- Red-Black Tree
- Hash
- 인터페이스
- 고정 세션
- 추상클래스
- java
- syncronized
- 로드 밸런서
- nosql
- Spring
- Load Balancer
- 인스턴스변수
- Caching
- 오블완
- @conditional
- 다중화
- 티스토리챌린지
- Security
- Sticky Session
- JPA
- spring boot
- object
- HashMap
- fail-fast
- AutoConfiguration
- 자동구성
- nginx
- 정적변수
- fail-safe
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |