MariaDB | 제약 조건 CONSTRAINTS

2025. 2. 4. 10:37기반기술/Database

제약조건

테이블에 데이터가 입력 되거나 수정 될 때의 규칙, 데이터베이스 무결성 보장하는데 도움이 된다. 

  1. NOT NULL: NULL 값을 허용하지 않음 
  2. UNIQUE: 중복값을 허용하지 않음 
  3. PRIMARY KEY (PK): 식별자
    • 식별자 역할, 테이블에서 한 행의 정보를 찾기 위해 사용 할 컬럼
    • 한 테이블당 한 개만 설정할 수 있음
    • NOT NULL + UNIQUE
    • 복합키: 한 개 컬럼에 설정할 수도 있고, 여러 개의 컬럼을 묶어서 설정할 수도 있음 (테이블 레벨 설정만 가능)
  4. FOREIGN KEY (FK): 외부키
    • 다른 테이블을 참조하도록 하는 역할
    • FOREIGN KEY 제약조건에 의해서 테이블 간의 관계(RELATIONSHIP)가 형성 됨
    • 참조(REFERENCES)된 다른 테이블(부모)에서 제공하는 값만 사용할 수 있음
    • 예: 학생정보 테이블(부모)에 있는 학생만 학생성적 테이블(자식)에 성적이 입력되게 제한
    • UPDATE/DELETE 옵션들
      • 디폴트: 자식 테이블에 정보가 없는 경우에만 부모 수정, 삭제 가능 
      • ON UPDATE/DELETE CASCADE : 부모가 삭제될 때 자식도 같이 삭제
      • ON UPDATE/DELETE SET NULL : 부모가 삭제될 때 자식은 NULL로 세팅
  5. CHECK: 조건을 지키는 경우에만 허용 
  6. 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;