2번 회원만 활성화하려 했는데 조회해 보니 세 명 모두 active다. UPDATE는 성공했다고 나오고, 데이터베이스는 '정말 전부 바꿀까요?'라는 확인창을 띄워 주지 않는다. 아직 커밋 전이라면 먼저 멈추자. 같은 세 행으로 어디서 범위가 넓어졌고 어떻게 취소하는지 확인해 보자.
SQL UPDATE에서 WHERE를 빼면 몇 행이 바뀔까?
UPDATE의 SET은 바꿀 값을 정하고, WHERE는 바꿀 행을 고른다. 아래 SQLite 예제의 회원 세 명은 모두 pending이다. SQL은 같은 연결에서 순서대로 실행한다.
CREATE TABLE members (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
status TEXT NOT NULL
);
INSERT INTO members (id, name, status) VALUES
(1, 'Ada', 'pending'),
(2, 'Ben', 'pending'),
(3, 'Cia', 'pending');
BEGIN;
UPDATE members SET status = 'active';
SELECT changes() AS affected_rows;
SELECT id, status FROM members ORDER BY id;affected_rows
3
id status
1 active
2 active
3 activeWHERE가 없으니 2번만이 아니라 세 행이 대상이다. changes()는 직전 명령이 영향을 준 행 수를 알려 주는 SQLite 함수다. 여기서는 3이라는 숫자와 실제 ID를 함께 확인했다. 행 수만 보고 '원하던 세 명인가?'까지 알 수는 없다.
아래 그림에서도 왼쪽은 조건 없는 UPDATE, 오른쪽은 2번을 고른 UPDATE다. 세 행이 한꺼번에 바뀌는지, 가운데 한 행만 바뀌는지가 핵심이다.
COMMIT 전이라면 ROLLBACK으로 되돌릴 수 있을까?
위 예제는 BEGIN으로 트랜잭션을 시작했고 아직 COMMIT하지 않았다. 이때 같은 연결에서 ROLLBACK하면 세 행의 수정이 취소된다.
ROLLBACK;
SELECT id, status FROM members ORDER BY id;id status
1 pending
2 pending
3 pending반대로 이미 COMMIT한 변경은 나중에 ROLLBACK 한 줄로 취소되지 않는다. 그때는 변경 기록과 백업 등을 확인해 별도 복구를 판단해야 한다. DBMS마다 트랜잭션 시작 문법과 자동 커밋 설정이 다르므로, 실제 데이터를 수정하기 전에는 사용 중인 연결의 설정도 확인해야 한다.
안전하게 한 행만 UPDATE하려면 무엇을 확인할까?
이번에는 먼저 같은 조건으로 대상 ID를 조회하고, id = 2와 기존 상태 pending을 함께 조건에 넣는다. 조건 확인부터 수정·커밋까지 같은 트랜잭션에서 진행한다.
BEGIN;
SELECT id, status
FROM members
WHERE id = 2 AND status = 'pending';
UPDATE members
SET status = 'active'
WHERE id = 2 AND status = 'pending';
SELECT changes() AS affected_rows;
COMMIT;
SELECT id, status FROM members ORDER BY id;조회 대상: 2 pending
affected_rows: 1
id status
1 pending
2 active
3 pending조회한 ID가 맞는지, UPDATE의 영향 행 수가 예상한 1건인지, 최종 상태가 맞는지를 차례로 본다. 사전 SELECT만 믿고 커밋하지는 말자. 다른 작업이 그 사이에 데이터를 바꿀 수 있으므로 UPDATE 자체의 조건과 실행 결과도 확인해야 한다. 예상과 다르면 커밋하지 않고 원인을 살피는 편이 안전하다.
핵심 요약
UPDATE에서 WHERE를 빼면 조건에 맞는 한 행이 아니라 테이블의 모든 행이 수정 대상이 된다. 먼저 같은 조건으로 대상 ID를 확인하고, 트랜잭션 안에서 수정한 뒤 영향 행 수와 결과를 대조하자. 예상과 다르고 아직 커밋 전이라면 ROLLBACK으로 취소한다. 이미 커밋했다면 별도 복구가 필요하다.

