테이블 단위에서 데이터의 무결성을 보장하는 규칙
테이블 수정 작업하는 경우에 잘못 된 트랜잭션 수행을 방지하는 역할을 한다.
테이블 간 제약 조건이 있어서 종속성이 있는 경우 테이블 삭제를 방지한다.
개념:
테이블 내에서 각 레코드를 고유하게 식별할 수 있는 열(또는 열의 조합)입니다. 기본 키가 설정된 열은 중복된 값을 가질 수 없으며, NULL 값을 허용하지 않습니다.
특징:
각 테이블에 하나의 기본 키만 정의할 수 있습니다.
기본 키로 지정된 열은 해당 테이블에서 각 행을 고유하게 식별합니다.
중복된 데이터 입력이 불가능하며, 데이터베이스에서 데이터 무결성을 보장합니다.
예시:
학생 테이블에서 학생ID를 기본 키로 설정하면, 각 학생을 고유하게 식별할 수 있습니다.
CREATE 문으로 PK 설정
CREATE TABLE 테이블명 ( 필드명 필드타입 PRIMARY KEY, --ex ) ID Strimg PRIMARY KEY 필드명 필드타입, 필드명 필드타입 );
개념:
한 테이블의 열이 다른 테이블의 기본 키를 참조하여, 테이블 간의 관계를 정의하는 제약 조건입니다. 외래 키는 두 테이블 간의 참조 무결성을 유지합니다.
특징:
외래 키가 설정된 열의 값은 참조하는 테이블의 기본 키 값과 일치해야 합니다.
부모 테이블에서 기본 키 값이 삭제되거나 변경될 때, 외래 키가 참조하는 자식 테이블에 영향을 미칠 수 있습니다.
외래 키는 부모 테이블의 기본 키 값이 아닌 값을 허용하지 않아 데이터 무결성을 유지합니다.
예시:
수강 기록 테이블의 학생ID가 학생 테이블의 학생ID를 참조하는 외래 키로 설정되면, 학생 테이블에 존재하지 않는 학생 ID는 수강 기록 테이블에 입력할 수 없습니다.
| 옵션 | 설명 |
|---|---|
ON DELETE CASCADE | 부모 테이블의 레코드가 삭제되면 자식 테이블의 관련 레코드도 함께 삭제 |
ON DELETE SET NULL | 부모 레코드 삭제 시 자식 테이블의 외래 키 값을 NULL로 설정 |
ON DELETE RESTRICT | 부모 레코드에 자식이 존재하면 삭제 불가 (기본값) |
ON UPDATE CASCADE | 부모의 기본 키가 수정되면 자식 테이블도 자동으로 반영 |
ON UPDATE SET NULL | 부모 키 수정 시 자식 테이블 외래 키를 NULL로 변경 |
ON UPDATE RESTRICT | 부모 키에 자식이 존재하면 수정 불가 (기본값) |
동작 Ex)
CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE orders ( id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE -- 유저 삭제 시 주문도 자동 삭제 ON UPDATE CASCADE -- 유저 ID 변경 시 주문 테이블도 반영 );
CREATE TABLE 테이블명 ( FOREIGN KEY(필드 이름) REFERENCES 참조 테이블명(필드 이름) ); -- FK 문법 사용시에는 FOREIGN KEY 제약 조건을 설정해야 된다. -- 참조되는 테이블 명은 REFERENCES 뒤에 명시한다.
개념:
특정 열이 고유한 값을 가지도록 보장하는 제약 조건으로, 중복된 값을 허용하지 않습니다. 다만, 고유 키는 NULL 값을 허용할 수 있습니다.
특징:
하나의 테이블에 여러 개의 고유 키를 정의할 수 있습니다.
고유 키 제약 조건이 설정된 열은 데이터가 중복되지 않도록 보장합니다.
기본 키와 달리, NULL 값이 허용될 수 있으나, NULL 값은 하나만 가질 수 있습니다.
예시:
회원 테이블의 이메일 열에 고유 키 제약 조건을 설정하면, 중복된 이메일 주소가 입력되는 것을 방지할 수 있습니다.
CREATE TABLE 테이블명 ( 필드명 필드타입 UNIQUE, 필드명 필드타입, 필드명 필드타입 );
| 구분 | 기본 키 (Primary Key) | 외래 키 (Foreign Key) | 고유 키 (Unique Key) |
|---|---|---|---|
| 목적 | 각 레코드를 고유하게 식별 | 다른 테이블의 기본 키 참조 및 관계 형성 | 고유한 데이터 보장 (중복 허용 안 함) |
| 제약 조건 | 중복 및 NULL 값 허용하지 않음 | 참조하는 기본 키와 일치하는 값만 허용 | 중복 불가, NULL 값 허용 가능 |
| 테이블 내 개수 | 테이블당 하나만 설정 가능 | 여러 개 설정 가능 | 여러 개 설정 가능 |
| 기능 | 고유 식별자로 사용 | 테이블 간 관계와 참조 무결성 유지 | 유일성 보장, 기본 키와 달리 NULL 허용 |
기본 키(PK): 테이블에서 각 행을 고유하게 식별하고, 중복과 NULL을 허용하지 않습니다.
외래 키(FK): 다른 테이블의 기본 키를 참조하여 테이블 간 관계를 형성하고 참조 무결성을 유지합니다.
고유 키(UK): 특정 열이 중복되지 않도록 보장하며, 기본 키와 달리 NULL 값을 허용할 수 있습니다.
-- 부모 테이블 CREATE TABLE teams ( id INT PRIMARY KEY, name VARCHAR(50) UNIQUE NOT NULL ); -- 자식 테이블 CREATE TABLE users ( id INT PRIMARY KEY, email VARCHAR(100) UNIQUE, name VARCHAR(50) NOT NULL, team_id INT, FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE -- 팀 삭제 시 연쇄 삭제 ON UPDATE CASCADE -- 팀 ID 변경 시 자동 반영 ); -- 정상 삽입 INSERT INTO teams VALUES (1, 'Dev Team'); INSERT INTO users VALUES (1, 'test@test.com', '홍길동', 1); -- 제약조건 위반 예시 INSERT INTO users VALUES (1, 'test2@test.com', '김철수', 1); -- 에러: Duplicate entry '1' for key 'PRIMARY' INSERT INTO users VALUES (2, 'test@test.com', '이영희', 1); -- 에러: Duplicate entry 'test@test.com' for key 'email' INSERT INTO users VALUES (2, 'test2@test.com', '박민수', 999); -- 에러: Cannot add or update a child row (존재하지 않는 team_id)
개념 설명이랑 표 정리는 잘 되어 있는데,
제약조건이 실제로 어떻게 동작하는지 보여주는 예시 추가하면 좋겠음.
이런 식으로 직접 실행해보고 에러 확인해봐야
제약조건이 왜 필요한지, 어떻게 동작하는지 명확해짐.
ON DELETE CASCADE,ON UPDATE CASCADE같은 옵션도 중요한데 빠져있음.참조 관계 있을 때 부모 삭제되면 자식도 같이 삭제할지,
에러 발생시킬지 결정해야 하는데 이 옵션 모르면 설계 못함.