프로그래밍/DB

[DB] 외래키 부모테이블 자식테이블 삭제하지 않고 삭제하는 방법 (ON DELETE SET NULL)

ss-pro 2025. 3. 9. 14:51
반응형

기본적으로 외래키제약이 걸린상태에서는 부모테이블의 데이터를 삭제하기 위해서는 자식테이블의 외래키가 걸린데이터를 모두 삭제하고 부모테이블을 삭제해야만 해당 부분이 가능합니다.  아래와 같이 Department테이블과 Employee테이블의 DeptID가 제약조건이 걸려있다고 합시다. 

Department의 ID값이 1인 연구소 테이블을 삭제를 하게되면 제약조건때문에 아래와 같이 삭제가 되지 않습니다.  Employee테이블의 DeptID값이 1인 홍길동,BBB데이터를 모두 삭제 후에만 해당정보가 삭제가 가능합니다. 

1. ON DELETE SET NULL 옵션 사용.
부모(Primary Key) 테이블에서 행이 삭제될 때, 자식(Foreign Key) 테이블의 관련 데이터를 삭제하지 않고 NULL로 설정해야 하는 경우. 예를 들어, 직원 테이블(Employee)과 부서 테이블(Department)이 있을 때, 부서가 삭제되더라도 직원 정보는 유지해야 하지만, 직원의 부서 ID는 NULL로 설정해야 할 때 사용.

2. ON DELETE SET NULL을 사용할 방법
외래키 생성시 ON DELETE SET NULL 항목 추가생성합니다.  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
CREATE TABLE Department (
    DeptID INT PRIMARY KEY,
    DeptName VARCHAR(50)
);
 
CREATE TABLE Employee (
    EmpID INT PRIMARY KEY,
    EmpName VARCHAR(50),
    DeptID INT NULL,
    CONSTRAINT FK_Employee_Department FOREIGN KEY (DeptID)
        REFERENCES Department(DeptID) 
        ON DELETE SET NULL
);


3. ON DELETE SET NULL을 사용할 때 주의할 점
1) 외래 키(Foreign Key) 컬럼이 NULL을 허용해야 함
- 만약 DeptID가 NOT NULL이면 SET NULL을 사용할 수 없기때문에 테이블 생성시에 다음과 같이 DeptID값에 NULL허용을 해야함. ALTER TABLE Employee ALTER COLUMN DeptID INT NULL;

2) 연관된 데이터가 많을 경우 성능 저하 가능
- 삭제 시 SET NULL을 적용할 데이터가 많으면 성능이 저하될 수 있음.
3) 논리적 데이터 정합성 유지 필요
- NULL로 설정된 후에도 데이터가 의미를 가질 수 있도록 고려해야 함.
- NULL이 된경우에 해당값을 unknown?퇴사?등으로 표기한다거나 등의 프로그램상에서 의미있는데이터로 안내 필요.

4. 부모테이블 데이터 삭제시 자식테이블 반영정보 
Department테이블을 삭제 후 하면 자식테이블의 참조된 데이터가 NULL이 된 부분을 확인 할 수 있습니다. 아래 DeptID값1을 삭제하니 Employee테이블의 DeptID값이 1인 직원정보의 DeptID값이 모두 NULL이 된 부분을 확인 할 수 있습니다.