MariaDB | 제약 조건 CONSTRAINTS
2025. 2. 4. 10:37ㆍ기반기술/Database
제약조건
테이블에 데이터가 입력 되거나 수정 될 때의 규칙, 데이터베이스 무결성 보장하는데 도움이 된다.
- NOT NULL: NULL 값을 허용하지 않음
- UNIQUE: 중복값을 허용하지 않음
- PRIMARY KEY (PK): 식별자
- 식별자 역할, 테이블에서 한 행의 정보를 찾기 위해 사용 할 컬럼
- 한 테이블당 한 개만 설정할 수 있음
- NOT NULL + UNIQUE
- 복합키: 한 개 컬럼에 설정할 수도 있고, 여러 개의 컬럼을 묶어서 설정할 수도 있음 (테이블 레벨 설정만 가능)
- FOREIGN KEY (FK): 외부키
- 다른 테이블을 참조하도록 하는 역할
- FOREIGN KEY 제약조건에 의해서 테이블 간의 관계(RELATIONSHIP)가 형성 됨
- 참조(REFERENCES)된 다른 테이블(부모)에서 제공하는 값만 사용할 수 있음
- 예: 학생정보 테이블(부모)에 있는 학생만 학생성적 테이블(자식)에 성적이 입력되게 제한
- UPDATE/DELETE 옵션들
- 디폴트: 자식 테이블에 정보가 없는 경우에만 부모 수정, 삭제 가능
- ON UPDATE/DELETE CASCADE : 부모가 삭제될 때 자식도 같이 삭제
- ON UPDATE/DELETE SET NULL : 부모가 삭제될 때 자식은 NULL로 세팅
- CHECK: 조건을 지키는 경우에만 허용
- DEFAULT: 입력한 데이터가 없는 경우 디폴트값을 적용
제약조건 생성, 조회
-- 제약조건 설정
CREATE TABLE users (
id INT PRIMARY KEY, -- 기본 키 (컬럼 레벨)
email VARCHAR(255) UNIQUE, -- 유니크 제약조건 (컬럼 레벨)
age INT CHECK (age >= 18), -- 체크 제약조건 (컬럼 레벨)
country VARCHAR(50) NOT NULL, -- NOT NULL 제약조건
group_id INT,
-- 외래 키 (테이블 레벨)
CONSTRAINT fk_group FOREIGN KEY (group_id) REFERENCES groups(id)
);
-- 현재 제약조건 전체를 조회
SELECT CONSTRAINT_NAME CONSTRAINT_TYPE, CONSTRAINT_NAME
FROM USER_CONSTRAINTS;
-- 특정 테이블의 제약조건 조회
SELECT * FROM ALL_CONSTRAINTS
WHERE TABLE_NAME = '테이블명';
1. 제약조건 정의 방법
- 컬럼 레벨 방식
- 컬럼을 정의할 때 바로 옆에 제약조건을 지정하는 방식. 읽기 쉽고 간단함.
- 한 개의 컬럼에만 적용되는 제약조건을 정의할 때 사용한다.
- 복합 키(두 개 이상의 컬럼을 묶어서 제약을 설정하는 경우)는 지원하지 않음.
- 테이블 레벨 방식
- 컬럼 정의가 끝난 후, CONSTRAINT를 사용하여 여러 컬럼을 포함하는 제약조건을 정의하는 방식.
- 제약조건에 이름을 부여할 수 있음.
- 복합 키(두 개 이상의 컬럼을 묶는 제약조건) 설정할 때 필수적으로 사용해야 한다.
- MySql은 FOREIGN KEY도 테이블 레벨 방식에서만 가능하다.
- CHECK도 테이블 레벨에서 여러 컬럼을 함께 검증하는 경우 사용 가능.
2. 제약조건 정의시 직접 이름 지정
- 기본적으로 제약조건을 설정할 때 데이터베이스가 자동으로 이름을 부여하지만, 직접 이름을 지정할 수도 있다. CONSTRAINT fk_group FOREIGN KEY (group_id) REFERENCES groups(id)
- 제약조건에 이름을 정하는 이유
- 일관성 유지: 여러 개발자가 함께 작업할 때 특정 패턴(fk_<테이블명>_<컬럼명>)을 정해서 일관되게 사용하면 협업이 더 수월해진다.
- 가독성과 유지보수성 향상: fk_order_customer 같은 이름이면 이게 orders 테이블에서 customer와 관련된 외래 키라는 걸 한눈에 알 수 있다.
- 오류 메시지 해석 용이: 제약조건 위반 시 발생하는 오류 메시지에 제약조건 이름이 포함되는데, 자동 생성된 이름(fk_34jh3k2h3j)이 아니라 fk_order_customer라면 오류를 분석하기 훨씬 쉽다.
- 수동 삭제 및 변경 용이: 나중에 ALTER TABLE을 사용해서 제약조건을 삭제(DROP CONSTRAINT)하거나 변경하려면, 자동 생성된 이름보다 직접 부여한 이름을 사용하는 것이 편함.
제약조건 추가, 삭제
-- 제약조건 추가
ALTER TABLE 테이블명
ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);
ALTER TABLE users ADD PRIMARY KEY (id);
-- 외래키 제약조건 수정
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 FOREIGN KEY(외래키 칼럼명)
REFERENCES 참조테이블(참조테이블_PK) [ON DELETE 옵션] [ON UPDATE 옵션]
ALTER TABLE users ADD CONSTRAINT fk_group
FOREIGN KEY (group_id) REFERENCES groups(id)
ON DELETE CASCADE ON UPDATE CASCADE;
-- 제약조건 삭제
ALTER TABLE 테이블명
DROP CONSTRAINT 제약조건명;
ALTER TABLE users DROP INDEX unique_email;