Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 외래 키 제약 조건이 있어도 테이블을 안전하게 비우는(TRUNCATE) 방법

MySQL에서 테이블 TRUNCATE 시 외래 키 제약 오류 해결하기

MySQL에서 여러 테이블 사이에 외래 키(Foreign Key) 관계가 설정되어 있다면, 해당 테이블에 TRUNCATE 명령을 바로 실행할 때 제약 조건 위반 오류가 발생할 수 있습니다. 이런 경우에는 먼저 FOREIGN_KEY_CHECKS를 비활성화(0으로 설정)한 뒤 테이블을 잘라내고(truncate), 작업이 끝나면 다시 활성화(1로 설정)해야 합니다.

기본 문법

여러 개의 테이블을 한 번에 비우고 싶다면 아래와 같은 순서로 쿼리를 작성하면 됩니다.

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE yourTableName1;
TRUNCATE TABLE yourTableName2;
TRUNCATE TABLE yourTableName3;
...
TRUNCATE TABLE yourTableNameN;
SET FOREIGN_KEY_CHECKS = 1;

즉, 작업 전후로 외래 키 검사 설정을 껐다가 다시 켜는 것이 핵심입니다. 이렇게 하면 참조 무결성 검사를 일시적으로 건너뛰고 테이블 데이터를 빠르게 삭제할 수 있습니다.

실제 실행 예제

테스트 데이터베이스의 두 테이블 skiplasttenrecordssearchtextdemo를 비워보겠습니다.

mysql> SET FOREIGN_KEY_CHECKS = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> TRUNCATE TABLE skiplasttenrecords;
Query OK, 0 rows affected (0.97 sec)

mysql> TRUNCATE TABLE searchtextdemo;
Query OK, 0 rows affected (0.89 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

모든 쿼리가 정상적으로 실행되었으며, 마지막에 반드시 FOREIGN_KEY_CHECKS = 1로 되돌려 데이터베이스의 참조 무결성 검사를 복원해야 합니다.

데이터 삭제 확인하기

테이블이 실제로 비워졌는지 확인하려면 SELECT 문으로 조회해 보면 됩니다.

mysql> SELECT * FROM searchtextdemo;
Empty set (0.00 sec)

mysql> SELECT * FROM skiplasttenrecords;
Empty set (0.00 sec)

Empty set(빈 결과 집합)이 출력되었다면 해당 테이블에 더 이상 레코드가 남아 있지 않다는 의미입니다. 즉, TRUNCATE 작업이 성공적으로 완료된 것입니다.

주의사항

FOREIGN_KEY_CHECKS = 0은 참조 무결성 검사를 일시적으로 끄는 강력한 기능이므로, 운영 환경에서는 신중하게 사용해야 합니다. 작업 후 반드시 다시 활성화하고, 가능하다면 트랜잭션 내에서 처리하거나 백업을 먼저 수행하는 것이 안전합니다.