반응형
MySQL은 JSON 데이터를 다룰 수 있는 강력한 기능을 제공한다.
특히, JSON 컬럼에 저장된 값을 기준으로 조건부 삭제를 해야 할 때는 DELETE 문과 JSON 관련 함수들을 조합하여 처리할 수 있다.

🧠 왜 JSON 컬럼에서 DELETE 조건을 걸어야 할까?
최근 웹 애플리케이션에서 다양한 사용자 설정, 복합 구조의 데이터가 JSON 형식으로 저장되는 경우가 많다.
예를 들어 사용자 권한, 알림 설정, 제품 옵션 등은 정규화된 테이블보다 JSON 컬럼으로 간단히 저장되곤 한다.
이런 경우 특정 JSON 필드에 따른 조건을 걸어 삭제하려면, MySQL의 JSON 함수와 DELETE 구문을 조합해야 한다.
🧾 기본 문법: DELETE + JSON_EXTRACT
DELETE FROM 테이블명
WHERE JSON_EXTRACT(json_컬럼, '$.key') = '값';
또는 -> 연산자도 사용 가능하다.
DELETE FROM 테이블명
WHERE json_컬럼->'$.key' = '값';
이 방식은 JSON 내부 구조까지 탐색하여 삭제 조건을 지정할 수 있는 강력한 방법이다.
반응형
🛠️ 실전 예제 1️⃣: 특정 role을 가진 사용자 삭제
예시 테이블: user_profiles
- 컬럼: id, name, settings (JSON)
DELETE FROM user_profiles
WHERE JSON_UNQUOTE(settings->'$.role') = 'guest';
위 쿼리는 settings 컬럼 안에 "role": "guest"인 사용자를 모두 삭제한다.
🔍 예제 2️⃣: 배열 안에 특정 값이 있는 경우 삭제
DELETE FROM orders
WHERE JSON_CONTAINS(tags, '"urgent"');
위 쿼리는 JSON 배열 컬럼 tags에 "urgent"가 포함된 모든 주문을 삭제한다.
💡 예제 3️⃣: 특정 필드가 NULL이거나 존재하지 않는 경우
DELETE FROM logs
WHERE JSON_EXTRACT(meta, '$.ip') IS NULL
OR JSON_CONTAINS_PATH(meta, 'one', '$.ip') = 0;
- JSON_EXTRACT는 필드 값이 NULL인 경우를 필터링
- JSON_CONTAINS_PATH는 필드 자체가 존재하지 않을 때 유용하다
반응형
🧪 복잡한 JSON 조건도 가능
DELETE FROM events
WHERE JSON_UNQUOTE(data->'$.type') = 'login'
AND JSON_UNQUOTE(data->'$.success') = 'false';
복수 조건을 조합하여 JSON 기반 필터링을 정밀하게 수행할 수 있다.
⚠️ 주의사항 및 팁
- JSON 컬럼은 문자열처럼 비교할 수 없기 때문에 항상 JSON 함수를 이용해야 한다
- JSON_UNQUOTE, JSON_EXTRACT, JSON_CONTAINS 등을 적절히 조합하여 조건을 구성해야 한다
- 삭제 전에 반드시 SELECT로 미리 검토하는 것이 안전하다
SELECT * FROM user_profiles
WHERE JSON_UNQUOTE(settings->'$.role') = 'guest';
- 인덱스 없이 JSON 컬럼 검색을 수행하면 성능 이슈가 발생할 수 있으므로 주의해야 한다
🔗 공식 문서 링크
반응형
'DB' 카테고리의 다른 글
| [MySQL] VIEW를 통한 INSERT / UPDATE / DELETE 사용법 완전정복 (0) | 2025.07.03 |
|---|---|
| [MySQL] CALL 프로시저 내 DML 실행 완전 정복 가이드 ⚙️ (0) | 2025.07.03 |
| [MySQL] LOAD DATA INFILE로 대용량 데이터 빠르게 삽입하는 방법 ⚡ (0) | 2025.07.03 |
| [MySQL] DELETE 실패 원인과 해결책 총정리 🧯 (1) | 2025.07.02 |
| [MySQL] DELETE + NULL 조건으로 누락 데이터 정리하기 🧹 (0) | 2025.07.02 |
| [MySQL] DELETE + 트랜잭션 처리로 안전한 데이터 삭제 구현하기 🔐 (0) | 2025.07.02 |
| [MySQL] DELETE + EXISTS / IN 조건으로 정밀하고 안전하게 데이터 삭제하기 ✂️ (0) | 2025.07.02 |
| [MySQL] DELETE + 서브쿼리로 조건에 맞는 데이터만 정밀하게 삭제하는 방법 (0) | 2025.07.02 |