반응형
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
반응형
'DB' 카테고리의 다른 글
| [MySQL] JSON_VALID, JSON_UNQUOTE 등 유틸 함수 총정리 (0) | 2025.07.28 |
|---|---|
| [MySQL] JSON_MERGE, JSON_ARRAY_APPEND 활용법 (2) | 2025.07.28 |
| [MySQL] JSON_CONTAINS, JSON_LENGTH 등 검사 함수 모음 (1) | 2025.07.28 |
| [MySQL] JSON_EXTRACT와 -> 연산자로 값 조회하기 (2) | 2025.07.28 |
| [MySQL] JSON_OBJECT, JSON_ARRAY로 JSON 생성하기 (1) | 2025.07.28 |
| [MySQL] JSON 데이터 타입과 기본 구조 이해하기 (1) | 2025.07.28 |
| [MySQL] 암호화와 해시 함수 선택 가이드 (1) | 2025.07.28 |
| [MySQL] COMPRESS와 UNCOMPRESS로 데이터 압축 처리하기 (1) | 2025.07.28 |