DB

[MySQL] UPDATE + WHERE (안전하고 정확한 데이터 수정 가이드)

인생아 2025. 6. 30. 20:43
반응형

MySQL에서 데이터를 수정할 때 가장 중요한 것이 있다면 바로 WHERE 조건이다.
UPDATE 문 자체는 단순하지만, WHERE 절을 제대로 작성하지 않으면 수천, 수만 건의 데이터가 의도치 않게 바뀔 수 있다.

✅ UPDATE + WHERE의 기본 구조

UPDATE 테이블명
SET 컬럼명 = 새로운값
WHERE 조건;

여기서 WHERE 절은 데이터를 필터링하여 수정 범위를 제한하는 핵심 요소이다.
조건 없이 실행하면 전체 테이블이 수정되므로 반드시 사용해야 한다.

✅ WHERE 절 없이 실행했을 때의 위험

UPDATE users SET status = 'inactive';

이 쿼리는 users 테이블의 모든 행의 status를 'inactive'로 바꾼다.
원하지 않는 대량 수정이 발생할 수 있으므로 WHERE 절은 선택이 아니라 필수이다.

반응형

✅ 단일 조건 예제

UPDATE members
SET points = 0
WHERE id = 1001;

특정 회원의 포인트를 초기화하는 기본적인 조건문이다.
id, username, email 등 고유한 키 기준으로 정확한 타겟팅이 가능하다.

✅ 복수 조건 (AND, OR)

AND 조건

UPDATE orders
SET status = '취소'
WHERE user_id = 501 AND status = '결제완료';

두 가지 조건을 모두 만족해야 수정된다. 정밀한 필터링에 사용된다.

OR 조건

UPDATE products
SET discount = 10
WHERE category = '식품' OR category = '생활용품';

둘 중 하나라도 만족하면 업데이트된다. 대상 범위를 넓힐 때 유용하다.

✅ BETWEEN, IN 조건

날짜 범위

UPDATE events
SET is_active = 0
WHERE start_date BETWEEN '2024-01-01' AND '2024-06-30';

특정 기간 안의 데이터를 일괄 수정할 때 매우 유용하다.

IN 조건

UPDATE users
SET user_type = 'internal'
WHERE id IN (101, 102, 103, 104);

여러 개의 고유값에 대해 한번에 조건을 걸 수 있다.

반응형

✅ IS NULL, IS NOT NULL

UPDATE orders
SET shipping_status = '대기중'
WHERE shipped_at IS NULL;

UPDATE members
SET verified = 1
WHERE email IS NOT NULL;

NULL 체크는 초기값이 없거나 누락된 데이터에 대한 처리에 매우 유용하다.

✅ LIKE 패턴 조건

UPDATE users
SET nickname = CONCAT(nickname, '_old')
WHERE nickname LIKE 'guest%';

게스트 계정에 _old를 붙여 별도 관리할 수 있도록 처리한 예제이다.
LIKE, REGEXP를 이용한 패턴 매칭은 대량의 유사 데이터 처리에 적합하다.

✅ 서브쿼리와 함께 쓰기

UPDATE products
SET discount_price = price * 0.9
WHERE id IN (
  SELECT product_id FROM promotions WHERE type = '한정할인'
);

서브쿼리를 활용하면 다른 테이블의 조건에 따라 대상 데이터를 정교하게 추출할 수 있다.

✅ 실전 예제: 로그인 이력 기준 사용자 상태 변경

UPDATE users
SET status = '휴면'
WHERE last_login < NOW() - INTERVAL 1 YEAR
  AND status = '활성';

로그인 기준으로 1년 이상 활동이 없는 사용자만 필터링하여 휴면처리하는 방식이다.
조건을 적절히 조합하면 운영 정책을 SQL로 깔끔하게 반영할 수 있다.

✅ 조건 작성 시 주의할 점

항목 설명
WHERE 생략 전체 행이 수정됨
인덱스 없는 조건 성능 저하 발생 가능
넓은 조건 사용 불필요한 데이터까지 수정될 위험 있음
조건 테스트 반드시 SELECT로 먼저 검증해볼 것

조건에 맞는 데이터를 수정하기 전에는 다음과 같이 SELECT로 먼저 확인하는 습관이 중요하다.

SELECT * FROM users WHERE status = 'active' AND last_login IS NULL;

이렇게 하면 실제로 어떤 데이터가 수정될지를 사전에 확인 가능하다.

✅ 공식 문서 참고

 

반응형