개발로그필름
[SQL] ON DELETE RESTRICT 본문
728x90
반응형
SMALL
SMALL
1. ON DELETE RESTRICT란?
- 부모 테이블의 데이터가 자식 테이블에서 참조되고 있을 때, 부모 데이터를 삭제할 수 없도록 막는 제약 조건
- 즉, 자식 테이블에 해당 외래 키(FK)를 사용하는 데이터가 존재하면 부모 테이블의 데이터를 삭제하려고 할 때 오류가 발생
- 이 제약 조건은 데이터 무결성을 유지하는 데 중요한 역할을 한다
- 실수로 부모 데이터를 삭제하여 자식 테이블에 고아 데이터(orphan data)가 남지 않도록 방지한다
반응형
2. ON DELETE RESTRICT 사용법
📌 테이블 생성 예제
CREATE TABLE parents (
parent_id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE children (
child_id INT PRIMARY KEY,
parent_id INT,
name VARCHAR(50),
FOREIGN KEY (parent_id) REFERENCES parents(parent_id) ON DELETE RESTRICT
);
✅ children 테이블의 parent_id는 parents(parent_id)를 참조함
✅ ON DELETE RESTRICT가 설정되어 있어서 부모가 삭제될 경우, 자식 테이블에서 해당 데이터를 참조 중이면 삭제 불가
3. ON DELETE RESTRICT 동작 확인
📌 1) 데이터 삽입
INSERT INTO parents (parent_id, name) VALUES (1, '부모 A');
INSERT INTO children (child_id, parent_id, name) VALUES (101, 1, '자식 A');
✅ 부모 데이터 parent_id = 1이 존재
✅ children 테이블에서 parent_id = 1을 참조하는 데이터가 존재
📌 2) 부모 데이터 삭제 시도
DELETE FROM parents WHERE parent_id = 1;
🚨 실행 결과: 오류 발생!
ERROR: Cannot delete or update a parent row: a foreign key constraint fails
✔ ON DELETE RESTRICT로 인해 부모 데이터를 삭제할 수 없음
✔ 부모를 삭제하려면 먼저 자식 테이블에서 해당 데이터를 삭제해야 함
📌 3) 해결 방법 (자식 데이터 먼저 삭제)
DELETE FROM children WHERE parent_id = 1;
DELETE FROM parents WHERE parent_id = 1;
✅ 자식 데이터를 먼저 삭제하면 부모 데이터 삭제 가능
4. ON DELETE 옵션 비교
옵션 | 설명 | 부모 삭제 시 자식 테이블의 동작 |
ON DELETE RESTRICT | 자식이 존재하면 부모 삭제 불가 | ❌ 오류 발생 |
ON DELETE CASCADE | 부모 삭제 시 자식도 자동 삭제 | ✅ 연쇄 삭제 |
ON DELETE SET NULL | 부모 삭제 시 자식의 FK 값을 NULL로 변경 | ✅ FK NULL |
ON DELETE NO ACTION | RESTRICT와 동일 (MySQL에서는 차이 없음) | ❌ 오류 발생 |
5. ON DELETE RESTRICT 사용할 때
✅ 데이터 무결성을 유지하고 싶을 때 (부모 삭제 시 자식을 보호)
✅ 자식 데이터를 수동으로 관리해야 할 때 (자동 삭제를 원하지 않을 때)
✅ 데이터 삭제가 신중해야 하는 경우 (예: 은행 계좌, 사용자 데이터 등)
✔ ON DELETE RESTRICT는 부모 데이터가 자식 테이블에서 참조 중이면 삭제를 막는 기능
✔ 부모 데이터를 삭제하려면 먼저 자식 데이터를 삭제해야 함
✔ 데이터 무결성을 강력하게 유지하는 데 유용하지만, 자동 삭제가 필요할 경우 CASCADE를 고려해야 함
반응형
LIST
'IT > SQL' 카테고리의 다른 글
[SQL] DATETIME과 TIMESTAMP의 차이점: 언제, 어떻게 사용할까? (0) | 2025.03.14 |
---|---|
[SQL] VIEW (0) | 2025.03.11 |
[SQL] SELECT문 실행 순서 (0) | 2025.03.11 |
[SQL] SUBSTRING() 함수 (0) | 2025.03.10 |
[SQL] 년, 월, 일 컬럼 값(date)만 있을 때 요일을 어떻게 조회하지? (0) | 2025.03.05 |
Comments