개요
MySQL에서 한 열의 데이터를 다른 열로 복사하거나 업데이트해야 하는 경우가 종종 있습니다. 이때 UPDATE 문과 함께 IS NOT NULL 조건을 사용하면, 특정 열이 NULL이 아닌 경우에만 데이터를 안전하게 업데이트할 수 있습니다.
이 글에서는 두 번째 열(ListOfName)이 NOT NULL인 경우에만 첫 번째 열(UserFirstName)의 값을 해당 값으로 대체하는 방법을 예제와 함께 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserFirstName varchar(20),
ListOfName varchar(20)
);
Query OK, 0 rows affected (0.59 sec)UserId는 자동 증가(AUTO_INCREMENT) 기본 키로 설정되어 있으며, UserFirstName과 ListOfName 두 개의 문자열 열이 포함되어 있습니다.
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 여러 레코드를 삽입합니다. 일부 행에는 의도적으로 NULL 값을 넣어 조건부 업데이트의 동작을 확인할 수 있도록 합니다.
mysql> insert into DemoTable(UserFirstName,ListOfName) values('John','Larry');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable(UserFirstName,ListOfName) values('Carol',null);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(UserFirstName,ListOfName) values('David','Sam');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable(UserFirstName,ListOfName) values('Bob',null);
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable(UserFirstName,ListOfName) values(null,null);
Query OK, 1 row affected (0.18 sec)3. 현재 데이터 확인하기
SELECT 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+---------------+------------+ | UserId | UserFirstName | ListOfName | +--------+---------------+------------+ | 1 | John | Larry | | 2 | Carol | NULL | | 3 | David | Sam | | 4 | Bob | NULL | | 5 | NULL | NULL | +--------+---------------+------------+ 5 rows in set (0.00 sec)
4. 조건부 업데이트 쿼리 실행하기
이제 핵심 부분입니다. ListOfName 열이 NOT NULL인 행에 대해서만 UserFirstName 열의 값을 ListOfName 열의 값으로 업데이트하는 쿼리는 다음과 같습니다.
mysql> update DemoTable set UserFirstName=ListOfName where ListOfName is not null; Query OK, 2 rows affected (0.26 sec) Rows matched: 2 Changed: 2 Warnings: 0
WHERE 절에 IS NOT NULL 조건을 추가했기 때문에, ListOfName이 NULL인 행(2번 Carol, 4번 Bob, 5번 행)은 업데이트 대상에서 제외됩니다. 실행 결과 2개의 행만 변경된 것을 확인할 수 있습니다.
5. 업데이트 결과 확인하기
UserFirstName 열이 정상적으로 업데이트되었는지 다시 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+---------------+------------+ | UserId | UserFirstName | ListOfName | +--------+---------------+------------+ | 1 | Larry | Larry | | 2 | Carol | NULL | | 3 | Sam | Sam | | 4 | Bob | NULL | | 5 | NULL | NULL | +--------+---------------+------------+ 5 rows in set (0.00 sec)
정리
결과를 보면 ListOfName 값이 존재하던 1번 행은 'Larry'로, 3번 행은 'Sam'으로 UserFirstName이 변경되었습니다. 반면 ListOfName이 NULL이었던 나머지 행들은 원래 값 그대로 유지되었습니다.
이처럼 UPDATE ... SET ... WHERE 열명 IS NOT NULL 패턴을 활용하면 NULL 값으로 인한 의도치 않은 데이터 덮어쓰기를 방지하면서, 조건에 맞는 행만 선택적으로 업데이트할 수 있습니다. 실무에서도 데이터 정제나 마이그레이션 작업 시 매우 유용하게 사용되는 기법이므로 꼭 기억해 두시기 바랍니다.