DB

[MySQL] UPDATE로 다중 컬럼 동시에 수정하는 방법 완벽 정리

인생아 2025. 6. 30. 19:57
반응형

MySQL에서 데이터를 수정할 때 한 번에 여러 컬럼의 값을 바꿔야 하는 경우가 자주 있다.
예를 들어 회원 등급과 포인트를 동시에 변경하거나, 상품 가격과 재고를 함께 조정하는 상황 등 실무에서 매우 흔한 요구사항이다.
이럴 때 유용하게 사용할 수 있는 것이 바로 UPDATE 문에서 다중 컬럼을 동시에 수정하는 문법이다.

✅ UPDATE 다중 컬럼 기본 문법

UPDATE 테이블명
SET 컬럼1 = 값1,
    컬럼2 = 값2,
    컬럼3 = 값3
WHERE 조건;

SET 뒤에 여러 컬럼을 쉼표로 구분하여 나열하면, 동시에 여러 필드가 수정된다.

기본 예제

UPDATE users
SET status = 'inactive',
    last_login = NOW()
WHERE id = 1001;

이 쿼리는 특정 사용자의 상태를 'inactive'로 변경하고, 마지막 로그인 시간을 현재 시간으로 설정한다.
단일 UPDATE 문이므로 성능도 빠르고, 트랜잭션 처리도 간단하다.

반응형

✅ 숫자 연산을 함께 적용

컬럼 수정 시 단순히 고정값만이 아니라, 기존 값을 기준으로 산술 연산도 적용할 수 있다.

UPDATE products
SET price = price * 1.05,
    stock = stock - 10
WHERE product_id = 3001;

위 예제는 상품 가격을 5% 인상하고, 재고를 10개 차감한다.
가격 조정 + 수량 관리를 함께 처리할 수 있어 유용하다.

✅ 문자열 연결과 날짜 변경

UPDATE events
SET title = CONCAT('[종료]', title),
    end_date = NOW()
WHERE status = 'closed';

이 예제는 종료된 이벤트 제목 앞에 [종료]를 붙이고, 종료일을 현재 시각으로 설정한다.
문자열 함수와 시스템 함수도 다중 컬럼에 자유롭게 사용 가능하다.

✅ CASE 문과 함께 활용한 다중 컬럼 수정

조건에 따라 각 컬럼을 다르게 처리하려면 CASE 문을 활용하면 된다.

UPDATE users
SET level = CASE
              WHEN total_purchase >= 100000 THEN 'VIP'
              WHEN total_purchase >= 50000 THEN 'GOLD'
              ELSE 'SILVER'
            END,
    grade_updated_at = NOW()
WHERE status = 'active';

이 쿼리는 구매 금액에 따라 등급을 구분하고, 등급 수정 일자를 함께 갱신한다.
다양한 조건별 업데이트 로직을 다중 컬럼으로 처리할 수 있어 강력하다.

반응형

✅ 다중 컬럼 UPDATE + JOIN 활용 예제

다른 테이블의 값을 참조해서 여러 필드를 동시에 수정할 수도 있다.

UPDATE orders o
JOIN users u ON o.user_id = u.id
SET o.discount_rate = u.membership_discount,
    o.status = '적용완료'
WHERE o.status = '대기중';

이 예제는 사용자 정보에 따라 주문 테이블의 할인율과 상태를 동시에 수정하는 구조이다.
JOIN을 활용한 대량 데이터 처리 시에도 다중 컬럼 업데이트가 매우 유용하다.

✅ 주의사항: UPDATE 다중 컬럼 시 유의할 점

  • WHERE 절 누락 시 전체 데이터가 수정될 수 있으므로 반드시 조건을 지정해야 한다.
  • 컬럼 간 의존성이 있는 경우(예: 하나가 NULL이면 다른 컬럼도 연산 불가) 업데이트 순서를 고려해야 한다.
  • 다중 컬럼 업데이트 시에도 트랜잭션 처리 가능하므로 START TRANSACTION으로 묶어서 처리하면 안전하다.

✅ 트랜잭션을 활용한 다중 컬럼 수정 예시

START TRANSACTION;

UPDATE accounts
SET balance = balance - 50000,
    last_updated = NOW()
WHERE user_id = 1;

UPDATE accounts
SET balance = balance + 50000,
    last_updated = NOW()
WHERE user_id = 2;

COMMIT;

이 예제는 계좌 이체 시 두 사용자의 금액과 갱신일을 동시에 수정하는 트랜잭션 처리 방식이다.
실무에서 정합성이 중요한 데이터는 항상 트랜잭션으로 감싸야 한다.

✅ 공식 문서 링크

 

반응형