DB

[MySQL] DELETE + JSON 조건으로 JSON 데이터 기반 삭제 처리하기

인생아 2025. 7. 2. 20:10
반응형

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 컬럼 검색을 수행하면 성능 이슈가 발생할 수 있으므로 주의해야 한다

🔗 공식 문서 링크

반응형