SQL) SET FOREIGN_KEY_CHECKS = 0;

Songss·2024년 12월 20일

DBMS

목록 보기
19/20

이전글에 DELETE, TRUNCATE, CASCADE, DROP 기능을 살펴 봤습니다.
[링크]

이 글을 작성하는 목적은..

테이블의 delete를 사용하게 되어도 Auto_Increment의 값을 유지 됩니다.
그러나 Truncate를 사용하게 되면 Auto_Incremeent의 값은 0으로 초기화 됩니다.

그런 Truncate를 사용하게 될 때, 1가지 문제점이 있습니다.

Truncate를 사용하게 될 때, 해당 테이블의 Foreigen Key로 인해서
삭제 안될 수 있다는 것이다.
즉 , 외래키때문에 truncate를 사용할 수 없다는 것이다.

그래서 오류 해결하기 위한 1가지 문법이 있다.

SET Foreign_key_checks = 0;

데이터베이스에 TRUNCATE를 사용할 때 발생할 수 있는 Error

SQL Error [1701] [42000]: 
Cannot truncate a table referenced in a foreign key 
constraint (`bookshop`.`orderedBook`, CONSTRAINT `orderdBooek_orders_FK`)

쉽게 설명하면 foreign key제약 조건으로 TRUNCATE를 실행할 수 없다는 의미 입니다.

원인:

  • TRUNCATE 명령어는 테이블의 모든 데이터를 빠르게 삭제하지만, 이는 트랜잭션 로그에 기록되지 않고 외래 키 제약 조건(Foreign Key Constraint)을 무시하지 않습니다.
  • 현재 테이블 orderedBook이 다른 테이블(orders)과 외래 키로 연결되어 있으므로, TRUNCATE 명령어를 실행할 수 없습니다.

외래 키 제약 조건:

오류 메시지의 내용을 보면, 다음과 같은 제약 조건이 있습니다:

  • 테이블 orderedBook에는 orderdBooek_orders_FK라는 외래 키가 정의되어 있고,
  • 이 외래 키가 bookshop.orders 테이블을 참조하고 있습니다.

해결 방법:

1. 외래 키 제약을 임시로 비활성화하고 TRUNCATE 실행

외래 키 제약 조건을 비활성화한 뒤 TRUNCATE를 실행할 수 있습니다.

sql
코드 복사
-- 외래 키 제약 비활성화
SET FOREIGN_KEY_CHECKS = 0;

-- 테이블 데이터 삭제
TRUNCATE TABLE orderedBook;

-- 외래 키 제약 활성화
SET FOREIGN_KEY_CHECKS = 1;

⚠️ 주의: 외래 키 제약을 비활성화하면 참조 무결성이 깨질 수 있으므로, 테이블 데이터 삭제 전에 충분히 검토하세요.

요약:

  • 외래 키 제약 조건이 있는 테이블에서는 TRUNCATE를 사용할 수 없습니다.
  • 비활성화(SET FOREIGN_KEY_CHECKS = 0), 외래 키 삭제, 또는 DELETE 명령으로 문제를 해결할 수 있습니다.
  • 데이터 무결성을 유지하려면 DELETE를 사용하는 것이 더 안전합니다.

0개의 댓글