MySQL에서 데이터 삭제 및 갱신 시 주의사항

 

MySQL에서 데이터를 삭제(DELETE)하거나 갱신(UPDATE)하는 작업은 매우 자주 사용되지만, 이로 인해 의도치 않은 데이터 손실이 발생할 수 있습니다. 특히 실무에서는 WHERE 절을 누락하거나 조건이 잘못된 쿼리로 인해 전체 테이블이 변경되는 사고가 빈번하게 일어납니다.

MySQL에서 데이터를 삭제하거나 갱신할 때 반드시 알아야 할 주의사항을 정리해보았습니다.


WHERE 절을 반드시 명시

다음 쿼리는 users 테이블의 모든 데이터를 삭제합니다. 실무에서 가장 흔한 실수입니다.

DELETE FROM users;

-> 항상 조건을 명확히 지정해야 합니다.

DELETE FROM users WHERE id = 101;

UPDATE도 마찬가지입니다:

UPDATE users SET email = 'test@example.com';

-> 위 쿼리는 모든 유저의 이메일을 변경합니다.

 

반드시 조건 추가:

UPDATE users SET email = 'test@example.com' WHERE id = 101;

 


트랜잭션(Transaction)을 활용

중요한 데이터를 수정하거나 삭제할 경우, BEGIN, ROLLBACK, COMMIT을 사용하면 변경사항을 되돌릴 수 있어 안전합니다.

START TRANSACTION;
DELETE FROM orders WHERE order_date < '2022-01-01';
-- 검토 후 문제가 없으면
COMMIT;
-- 문제가 있다면
ROLLBACK;
  

-> 실무에서는 꼭 트랜잭션을 습관화하시는 것이 좋습니다.

 


DELETE와 TRUNCATE의 차이

  • DELETE: WHERE 조건으로 일부만 삭제 가능, 트리거 실행됨
  • TRUNCATE: 테이블 전체 삭제, 트리거 미작동, 빠르지만 위험

TIP: TRUNCATE는 복구가 어렵기 때문에 DROP TABLE 수준의 위험성을 갖습니다.


갱신 시 논리 오류 방지

다음과 같은 실수는 종종 발생합니다:

UPDATE products SET stock = stock - 1 WHERE id = 10;

-> stock이 음수가 될 가능성 있음. 조건을 추가하세요:

UPDATE products SET stock = stock - 1 WHERE id = 10 AND stock > 0;

-> 데이터 무결성을 유지하려면 검증 로직도 함께 고려해야 합니다.

 


백업 후 실행하는 습관

UPDATE나 DELETE는 되돌릴 수 없기 때문에 중요 테이블은 백업 후 작업하는 것이 좋습니다.

mysqldump -u root -p mydb users > users_backup.sql

-> 특히 운영 환경에서는 백업 없이 직접 작업하지 마세요.

 


항상 안전하게 쿼리 실행

  • WHERE 절 빠짐 여부 항상 재확인
  • 가능하면 트랜잭션 사용
  • 데이터 백업은 필수
  • TRUNCATE, REPLACE 같은 위험한 명령어는 신중히
  • 수정 시 무결성과 논리적 조건을 함께 고려

실무에서 위 사항만 철저히 지켜도 데이터 손실 위험을 크게 줄일 수 있습니다.