728x90
회사 업무에서 데이터 원복을 위해 삭제해야하는 일이 생겼다.
그래서 별 생각없이 늘 하던대로 정산 데이터를 삭제하려고 했는데 생각보다 복잡했다.
시스템 버전이 있는데 현재는 거의 폐기 수준의 로우 버전이라 참조하고 있는 테이블도 달랐고 제약조건에 따라 순서대로 지워야 하였지만 테이블 제약 조건을 확인하고 지우는 방법을 터득하기 위해 여러번 뒹글고 나서 정리한다.
🤔 제약 조건 확인 방법
SELECT *
FROM information_schema.key_column_usage
WHERE TABLE_SCHEMA = '스키마' AND REFFERENCED_TABLE_NAME = '테이블명';
우선, 제약 조건을 확인하기 위해서는 삭제 하려는 데이터의 테이블이 어디에서 참조 하고 있는지를 알아야한다. 상단 쿼리로 스키마와 테이블을 설정하여 조회하면 확인이 가능하다.
SELECT *
FROM information_schema.table_constraints
WHERE TABLE_SCHEMA = '스키마' AND TABLE_NAME = '테이블명'
참조하고 있는 테이블에서 제약 조건이 어떻게 되어 있는지 확인 할 수 있다.
🙄 그래서 확인 하고 나서는 뭘 해야하지?
관계형 데이터베이스에서 무결성 원칙에 따라야 한다.
연관된 모든 데이터를 삭제한다는 것이다.
모든 연관된 테이블을 도출하고 어떤 테이블이 최상위 부모이고 어떤 테이블이 최하위 자식인지 그림이 그려져야 한다.
그림이 그려졌다면 그려진 그림에 따라 삭제 쿼리를 도출해서 제약조건에 어긋나지 않는 순서대로 삭제를 진행 할 수 있을 것이다.
😦 모든 연관된 데이터를 한번에 삭제하기 위해 제약조건에 ON DELETE CASCADE를 적용하면 되지만, 이는 원치 않는 데이터가 삭제 될 수 있기 때문에 심사숙고해서 결정해야한다고 생각한다.
728x90
'DATABASE > MySQL' 카테고리의 다른 글
[MySQL] Lost Connection to MySQL server during query (0) | 2022.08.17 |
---|---|
[MySQL] 내가 본 최악의 데이터 생성 쿼리문 (0) | 2021.04.20 |