결론부터 말씀드리면, MySQL의 UPDATE는 값이 기존과 완전히 동일한 경우 해당 값을 덮어쓰지 않습니다.
MySQL은 UPDATE 문을 실행할 때 새로 설정하려는 값과 현재 저장된 값을 비교합니다. 두 값이 같다면 실제 변경 작업을 수행하지 않기 때문에 'Rows matched'는 1로 표시되더라도 'Changed'는 0이 됩니다. 아래 예제를 통해 직접 확인해 보겠습니다.
1. 테스트용 테이블 생성
먼저 학생 정보를 저장할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
(
StudentId int,
StudentMathMarks int,
StudentMySQLMarks int
);
Query OK, 0 rows affected (0.46 sec)2. 샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values(1,56,78); Query OK, 1 row affected (0.21 sec) mysql> insert into DemoTable values(2,88,99); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(3,34,98); Query OK, 1 row affected (0.13 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------+------------------+-------------------+ | StudentId | StudentMathMarks | StudentMySQLMarks | +-----------+------------------+-------------------+ | 1 | 56 | 78 | | 2 | 88 | 99 | | 3 | 34 | 98 | +-----------+------------------+-------------------+ 3 rows in set (0.00 sec)
4. 동일한 값으로 UPDATE 실행
이제 StudentId가 2인 행에 대해 이미 저장되어 있는 것과 똑같은 값(수학 점수 88점, MySQL 점수 99점)으로 UPDATE를 실행해 보겠습니다.
mysql> update DemoTable set StudentId=2,StudentMathMarks=88,StudentMySQLMarks=99 where StudentId=2; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0
결과 분석
위 UPDATE 명령의 출력 결과를 주목해 보세요.
- Rows matched: 1 — WHERE 조건에 일치하는 행은 1개 존재합니다.
- Changed: 0 — 하지만 실제로 변경된 행은 없습니다.
즉, 설정하려는 값이 이미 해당 컬럼에 저장된 값과 동일하기 때문에 MySQL은 불필요한 쓰기 작업을 수행하지 않고 변경 사항을 무시합니다. 이러한 동작은 디스크 I/O와 바이너리 로그(binary log) 크기를 줄여주므로 성능 측면에서도 유리합니다.
정리하면, '0 rows affected'(변경된 행 없음)라는 결과가 나타난다면 그것은 오류가 아니라, UPDATE 대상 값이 기존 값과 동일하여 MySQL이 덮어쓰기를 생략했다는 의미입니다.