MySQL에서 기존 레코드를 덮어쓰지 않고 특정 열의 값 끝에 새로운 내용을 이어 붙이고 싶다면 UPDATE 문과 CONCAT(), IFNULL() 함수를 함께 사용하면 됩니다.
기본 문법
열에 데이터를 추가할 때 사용하는 기본 문법은 다음과 같습니다.
UPDATE yourTableName SET yourColumnName = concat(ifnull(yourColumnName,''), 'anyValue1,anyValue2,anyValue');
여기서 IFNULL() 함수가 중요한 역할을 합니다. 해당 열의 값이 NULL인 경우 빈 문자열('')로 대체해 주는데, 만약 이 처리를 생략하면 NULL에 대한 CONCAT 연산 결과도 NULL이 되어 해당 행은 업데이트되지 않는 문제가 발생합니다.
문법을 제대로 이해하기 위해 실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table AppendDataDemo -> ( -> StudentId int, -> StudentName varchar(100), -> StudentAge int -> ); Query OK, 0 rows affected (1.54 sec)
2단계: 샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다. 일부러 두 번째 학생의 이름은 NULL로 입력했습니다.
mysql> insert into AppendDataDemo values(101,'John',23); Query OK, 1 row affected (0.24 sec) mysql> insert into AppendDataDemo values(102,null,24); Query OK, 1 row affected (0.74 sec) mysql> insert into AppendDataDemo values(103,'Mike',26); Query OK, 1 row affected (0.12 sec)
3단계: 현재 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from AppendDataDemo;
실행 결과는 다음과 같습니다.
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 101 | John | 23 | | 102 | NULL | 24 | | 103 | Mike | 26 | +-----------+-------------+------------+ 3 rows in set (0.00 sec)
4단계: UPDATE 문으로 데이터 추가
이제 StudentName 열을 업데이트하여 각 이름 뒤에 "Carol, Sam, Maria"를 이어 붙여 보겠습니다.
mysql> update AppendDataDemo set StudentName=concat(ifnull(StudentName,""), ' Carol,Sam,Maria'); Query OK, 3 rows affected (0.14 sec) Rows matched: 3 Changed: 3 Warnings: 0
실행 결과를 보면 3개 행이 모두 정상적으로 변경된 것을 확인할 수 있습니다.
5단계: 결과 검증
SELECT 문으로 다시 테이블을 조회하여 데이터가 올바르게 추가되었는지 확인합니다.
mysql> select *from AppendDataDemo;
데이터가 추가된 최종 결과는 다음과 같습니다.
+-----------+----------------------+------------+ | StudentId | StudentName | StudentAge | +-----------+----------------------+------------+ | 101 | John Carol,Sam,Maria | 23 | | 102 | Carol,Sam,Maria | 24 | | 103 | Mike Carol,Sam,Maria | 26 | +-----------+----------------------+------------+ 3 rows in set (0.03 sec)
정리
결과를 보면 기존 값이 있던 행(John, Mike)에는 새 값이 뒤에 붙었고, 원래 NULL이었던 행(102번)에는 IFNULL() 덕분에 빈 문자열로 처리되어 "Carol,Sam,Maria"만 저장된 것을 확인할 수 있습니다. 만약 IFNULL() 없이 실행했다면 102번 행은 여전히 NULL로 남아 있었을 것입니다.
이처럼 UPDATE + CONCAT + IFNULL 조합은 로그 누적, 태그 추가, 메모 필드 확장 등 기존 데이터를 보존하면서 값을 덧붙여야 하는 상황에서 매우 유용하게 활용됩니다.