MariaDB 외래키 삭제 오류 해결 방법 - FOREIGN KEY 제약으로 테이블 삭제 안 될 때
요약: 이 글에서는 MariaDB에서 FOREIGN KEY 제약 때문에 테이블이 삭제되지 않을 때, 외래키를 조회하고 삭제하거나 ON DELETE CASCADE로 변경하는 실전 해결 방법을 소개합니다. 테이블 간 참조 관계를 파악하고, 외래키 이름을 찾고, 제약을 안전하게 제거하는 전체 과정을 단계별로 안내합니다.
목차
- FOREIGN KEY란 무엇인가?
- mariadb 외래키 제약 때문에 테이블이 삭제되지 않을 때
- 어떤 테이블이 참조 중인지 확인하는 방법
- 외래키 이름을 모를 경우 해결법
- mariadb 외래키 삭제 방법 3가지
- ON DELETE CASCADE로 변경하는 방법
- 외래키 일괄 삭제 SQL 생성
- FOREIGN KEY 제약 백업 및 복원
- 마무리
FOREIGN KEY란 무엇인가?
FOREIGN KEY(외래키)는 한 테이블의 컬럼이 다른 테이블의 기본 키를 참조하는 관계입니다. 예를 들어, 주문 정보(order_items) 테이블의 product_id 컬럼이 상품 정보(products) 테이블의 id를 참조한다면 이는 외래키 제약 관계입니다. 이로 인해 데이터의 무결성이 보장되지만, 삭제 및 수정 작업에 제약이 생깁니다.
mariadb 외래키 제약 때문에 테이블이 삭제되지 않을 때
MariaDB에서 테이블을 삭제하려고 할 때 다음과 같은 오류를 볼 수 있습니다.
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
이 오류는 다른 테이블이 해당 테이블을 FOREIGN KEY로 참조하고 있어 삭제가 불가능하다는 뜻입니다. 이런 경우, 참조 관계를 먼저 해제하거나 삭제 순서를 조정해야 합니다.
어떤 테이블이 참조 중인지 확인하는 방법
다음 쿼리를 통해 특정 테이블(products 등)을 참조하고 있는 테이블 목록을 확인할 수 있습니다.
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_NAME = 'products';
이 정보를 통해 어떤 테이블이 외래키로 해당 테이블을 참조 중인지 파악할 수 있습니다.
외래키 이름을 모를 경우 해결법
외래키 제약(CONSTRAINT_NAME)을 알아야 DROP할 수 있습니다. 아래 쿼리로 확인 가능합니다.
SELECT
CONSTRAINT_NAME,
TABLE_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
TABLE_SCHEMA = 'your_database'
AND TABLE_NAME = 'order_items';
이름을 모른다고 고민할 필요 없이, 위 쿼리로 모든 외래키 이름을 확인할 수 있습니다.
mariadb 외래키 삭제 방법 3가지
1. 참조하고 있는 테이블부터 삭제
DROP TABLE order_items;
DROP TABLE products;
참조 중인 테이블을 먼저 삭제하면 문제 없이 삭제됩니다. 하지만 모든 데이터를 지워야 하므로 신중히 판단해야 합니다.
2. 외래 키 제약만 제거
ALTER TABLE order_items DROP FOREIGN KEY fk_order_product_id;
DROP TABLE products;
데이터는 그대로 두고 제약만 삭제하는 방법입니다. 이후 참조 무결성은 개발자가 직접 관리해야 합니다.
3. FOREIGN KEY를 ON DELETE CASCADE로 설정
외래키를 삭제하지 않고도, 참조된 행을 자동으로 함께 삭제하도록 설정하는 방법입니다.
ALTER TABLE order_items
DROP FOREIGN KEY fk_order_product_id,
ADD CONSTRAINT fk_order_product_id
FOREIGN KEY (product_id)
REFERENCES products(id)
ON DELETE CASCADE;
이 설정 후 products 테이블에서 특정 상품을 삭제하면, order_items의 관련 행도 자동으로 삭제됩니다.
ON DELETE CASCADE로 변경하는 방법
기존 제약을 변경하려면 먼저 DROP 후 다시 ADD 해야 합니다. 위 예제처럼 ALTER TABLE로 구현할 수 있으며, 데이터 종속성 관리가 자동화되어 편리합니다.
외래키 일괄 삭제 SQL 생성
특정 테이블을 참조 중인 모든 외래 키를 제거하고 싶다면 다음 쿼리를 사용합니다.
SELECT
CONCAT('ALTER TABLE `', TABLE_NAME, '` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;') AS drop_sql
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_NAME = 'products'
AND TABLE_SCHEMA = 'your_database';
쿼리 결과를 복사해 실행하면 관련 외래키 제약을 모두 제거할 수 있습니다.
FOREIGN KEY 제약 백업 및 복원
나중에 외래키를 복원할 수 있도록 백업해두는 것도 좋은 방법입니다. 다음 쿼리로 외래 키를 다시 생성할 수 있는 SQL을 출력할 수 있습니다.
SELECT
CONCAT(
'ALTER TABLE `', TABLE_NAME, '` ADD CONSTRAINT `', CONSTRAINT_NAME, '` FOREIGN KEY (`', COLUMN_NAME, '`) ',
'REFERENCES `', REFERENCED_TABLE_NAME, '`(`', REFERENCED_COLUMN_NAME, '`);'
) AS recreate_fk_sql
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
TABLE_SCHEMA = 'your_database'
AND TABLE_NAME = 'order_items'
AND REFERENCED_TABLE_NAME IS NOT NULL;
이 결과를 저장해두면, 외래 키를 다시 복구할 수 있습니다.
마무리
MariaDB에서 FOREIGN KEY 제약은 데이터 무결성을 보장하는 중요한 기능입니다. 하지만 복잡한 테이블 구조에서는 오히려 테이블 삭제나 수정의 걸림돌이 되기도 합니다.
이번 글에서는 외래 키가 설정된 테이블을 삭제할 수 없는 상황에서 어떻게 참조 관계를 파악하고, 제약을 제거하거나 자동 삭제(CASCADE)를 적용할 수 있는지 살펴보았습니다.
실제 운영 환경에서는 외래키를 무조건 제거하기보다는, 데이터 관계를 이해하고 적절히 설계하는 것이 핵심입니다. 외래 키를 적절히 다루는 능력은 MariaDB를 안정적으로 운용하는 데 있어 중요한 기술 중 하나입니다.
이 글이 MariaDB의 외래키 문제로 고민 중인 분들에게 도움이 되었기를 바랍니다.
이 콘텐츠는 스마트베이(SmartBay)에서 제공하며, 실무 중심의 정보 전달을 목표로 구성되었습니다. 스마트베이는 다양한 개발자 경험을 바탕으로 실용적인 IT 정보를 지속적으로 소개합니다
비즈니스 효율을 높이는 스마트한 IT 솔루션을 제공합니다.
웹사이트 : www.esmartbay.co.kr
E-mail : smartbay.svc@gmail.com
카카오톡 : 바로 상담하기
'IT 실무 레시피' 카테고리의 다른 글
| Windows 11 설치를 위한 TPM 설정 가이드 (0) | 2025.09.13 |
|---|---|
| Windows 10 지원 종료, Windows 11 업그레이드 완벽 가이드 (2025 최신) (2) | 2025.09.12 |
| Prettier 사용법 완벽 가이드: 설치부터 자동화까지 한눈에! (1) | 2025.06.20 |
| npkcmsvc.exe 리소스 과다 문제 해결 및 완전 제거 방법 (2025 최신) (3) | 2025.06.16 |
| Chrome 자동 프린트 완전 정복: 키오스크, 영수증, PDF 출력 자동화까지 (0) | 2025.06.16 |