MySQL에서 DELETE 문은 데이터베이스 테이블의 특정 행(row)을 영구적으로 삭제하는 SQL 명령어이다.
사용하기는 쉽지만, 실수하면 복구가 어려우므로 반드시 정확한 문법과 조건을 이해하고 활용해야 한다.

✅ DELETE 기본 문법 구조
DELETE FROM 테이블명
WHERE 조건;
DELETE 문에서 WHERE 조건을 명시하지 않으면, 해당 테이블의 모든 행이 삭제되므로 주의해야 한다.
예제: 특정 사용자 삭제
DELETE FROM users
WHERE id = 101;
id가 101인 사용자를 삭제한다. 삭제된 후에는 해당 행을 복구할 수 없다.
예제: 전체 삭제 (위험)
DELETE FROM users;
주의: WHERE 절이 없으면 모든 데이터가 삭제되므로 반드시 조건을 명시해야 한다.
✅ DELETE vs TRUNCATE vs DROP 비교
| 명령어 | 의미 | 롤백 가능 | 테이블 구조 유지 | 자동 증가 초기화 |
| DELETE | 행 삭제 | O | O | X |
| TRUNCATE | 전체 삭제 | X | O | O |
| DROP | 테이블 삭제 | X | X | - |
DELETE는 가장 유연하고 안전한 삭제 명령어이지만, 많은 데이터를 삭제하면 성능에 영향을 줄 수 있다.
✅ DELETE WHERE 다중 조건
DELETE FROM orders
WHERE user_id = 5 AND status = '취소됨';
AND, OR, IN, BETWEEN 등을 활용하여 복잡한 조건 조합도 가능하다.
✅ DELETE + IN 조건 활용
DELETE FROM products
WHERE category_id IN (1, 2, 3);
여러 조건을 한 번에 지정할 때 유용하다.
✅ DELETE + 서브쿼리 활용
DELETE FROM cart
WHERE user_id IN (
SELECT id FROM users WHERE inactive = 1
);
서브쿼리를 통해 동적으로 삭제 대상을 지정할 수 있다.
✅ DELETE + LIMIT 적용
MySQL은 특정 개수만 삭제하고 싶을 때 LIMIT을 지원한다.
DELETE FROM logs
ORDER BY created_at ASC
LIMIT 100;
가장 오래된 로그 100개만 삭제하는 방식이다. 대량 삭제 시 자주 활용된다.
✅ DELETE + JOIN을 통한 다중 테이블 조건 삭제
MySQL은 JOIN을 활용한 삭제도 가능하다. 다만 문법이 조금 다르다.
DELETE u FROM users u
JOIN user_logs l ON u.id = l.user_id
WHERE l.status = '스팸';
JOIN을 활용해 연관 테이블 조건에 따라 삭제하는 방식이다.
✅ DELETE 실행 전 확인 팁
삭제 전, 반드시 SELECT로 조건을 검증하는 습관이 중요하다.
SELECT * FROM users WHERE status = '탈퇴';
조건이 맞는지 확인한 후 아래처럼 삭제한다.
DELETE FROM users WHERE status = '탈퇴';
✅ DELETE 실행 결과 확인
삭제한 행 수를 바로 확인할 수 있다.
SELECT ROW_COUNT();
또는 프로그래밍 언어에서는 affected_rows()를 통해 확인한다.
✅ 트랜잭션과 함께 안전하게 삭제
START TRANSACTION;
DELETE FROM payments WHERE status = '미완료';
DELETE FROM orders WHERE payment_status = '미완료';
COMMIT;
여러 삭제가 동시에 이뤄질 때는 트랜잭션(Transaction)으로 묶어야 데이터 정합성을 보장할 수 있다.
✅ 실무에서 자주 발생하는 DELETE 관련 문제
- WHERE 조건 누락으로 전부 삭제됨
- 외래키 제약(FK) 때문에 삭제 실패
- 트리거로 인해 삭제되지 않음
- 트랜잭션 커밋 누락으로 삭제 반영 안됨
이런 문제들은 모두 DELETE 문 사용 시 발생할 수 있으므로, 사전에 확인하는 습관이 필요하다.
✅ 공식 문서 참고 링크
'DB' 카테고리의 다른 글
| [MySQL] DELETE + 서브쿼리로 조건에 맞는 데이터만 정밀하게 삭제하는 방법 (0) | 2025.07.02 |
|---|---|
| [MySQL] DELETE + JOIN으로 두 테이블 이상에서 조건에 맞는 데이터 안전하게 삭제하는 방법 (0) | 2025.07.02 |
| [MySQL] DELETE + LIMIT / ORDER BY로 원하는 개수만 안전하게 삭제하는 방법 (2) | 2025.07.02 |
| [MySQL] DELETE + WHERE 조건으로 안전하게 데이터 삭제하는 방법 총정리 (0) | 2025.07.02 |
| [MySQL] UPDATE 실패 원인과 해결법 완전 정복 – 수정이 안될 때 확인할 모든 것 (2) | 2025.07.01 |
| [MySQL] UPDATE 트랜잭션 적용하기: 데이터 무결성을 지키는 안전한 수정 전략 (1) | 2025.07.01 |
| [MySQL] UPDATE 문에서 NULL 처리하는 방법 완전 정리 (0) | 2025.07.01 |
| [MySQL] UPDATE + NOW() 함수로 날짜 자동 수정하는 실전 활용법 (0) | 2025.06.30 |