DB

[MySQL] JSON_SET, JSON_REPLACE로 값 수정하기

인생아 2025. 7. 28. 16:57
반응형

MySQL의 JSON_SET()과 JSON_REPLACE() 함수는 JSON 컬럼 내의 특정 경로 값을 수정하거나 조건부로 대체할 때 사용된다. 두 함수 모두 원본 JSON을 수정한 새로운 JSON 값을 반환하므로, UPDATE 구문과 함께 자주 사용된다.

1. JSON_SET 함수란?

JSON_SET(json_doc, path, value[, path, value] ...)
  • 지정한 path에 value를 할당
  • 해당 키가 존재하면 덮어쓰기, 존재하지 않으면 새 키로 추가

예제

SELECT JSON_SET('{"name": "홍길동"}', '$.age', 30);
-- 결과: {"name": "홍길동", "age": 30}
  • 기존에 age가 없으면 추가됨
SELECT JSON_SET('{"name": "홍길동", "age": 25}', '$.age', 30);
-- 결과: {"name": "홍길동", "age": 30}
  • 기존 키가 있으면 해당 값 덮어쓰기
반응형

2. JSON_REPLACE 함수란?

JSON_REPLACE(json_doc, path, value[, path, value] ...)
  • 지정한 path에 키가 존재할 경우에만 값을 덮어씀
  • 해당 경로가 없으면 변경 없이 원본 유지

예제

SELECT JSON_REPLACE('{"name": "영희"}', '$.age', 30);
-- 결과: {"name": "영희"}  ← 아무 변화 없음
SELECT JSON_REPLACE('{"name": "영희", "age": 25}', '$.age', 30);
-- 결과: {"name": "영희", "age": 30}

3. JSON_SET vs JSON_REPLACE 비교 정리

항목 JSON_SET JSON_REPLACE
키 존재 시 값 덮어씀 값 덮어씀
키 미존재 시 새로 추가 아무 일도 하지 않음
주 용도 값 수정 + 추가 조건부 값 수정

4. 테이블 컬럼 값 수정 예제

CREATE TABLE users (
  id INT,
  profile JSON
);

INSERT INTO users VALUES
(1, '{"name": "철수", "age": 20}'),
(2, '{"name": "영희"}');

JSON_SET으로 추가/수정

UPDATE users
SET profile = JSON_SET(profile, '$.age', 30)
WHERE id = 2;
  • age가 없는 경우 → "age": 30 추가됨

JSON_REPLACE로 조건 수정

UPDATE users
SET profile = JSON_REPLACE(profile, '$.age', 40)
WHERE id = 1;
  • age 키가 존재할 때만 수정됨

5. 중첩 객체 경로 수정

SELECT JSON_SET(
  '{"user": {"name": "민수", "email": "a@b.com"}}',
  '$.user.email', 'new@domain.com'
);
-- 결과: {"user": {"name": "민수", "email": "new@domain.com"}}
  • 중첩 경로도 정확히 지정 가능 ('$.user.email')
반응형

6. 배열 요소 수정 (주의)

SELECT JSON_SET('["A", "B", "C"]', '$[1]', "X");
-- 결과: ["A", "X", "C"]
  • 배열의 특정 인덱스도 수정 가능
SELECT JSON_REPLACE('["A", "B", "C"]', '$[5]', "Z");
-- 결과: ["A", "B", "C"] (인덱스가 없으므로 변화 없음)

7. 실무 팁: UPDATE + JSON_SET 조합

UPDATE users
SET profile = JSON_SET(profile, '$.updated_at', NOW())
WHERE id = 1;
  • JSON 안에 타임스탬프 기록
  • 변경이력 관리 등 실무에 자주 사용됨

8. 한 번에 여러 키 수정

SELECT JSON_SET(
  '{"a": 1, "b": 2}',
  '$.a', 10,
  '$.b', 20,
  '$.c', 30
);
-- 결과: {"a": 10, "b": 20, "c": 30}
  • 한 번의 함수 호출로 여러 필드 동시 수정/추가 가능

참고 문서

https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html

 

반응형