INSERT UPDATE DELETE
2026년 8월 28일
INSERT UPDATE DELETE
데이터를 바꾸는 문장들(DML). 구조를 바꾸는 DDL과 구분된다.
INSERT
SQL
열 목록을 생략하면 테이블 열 순서에 의존한다. 항상 열을 명시한다 — 열이 추가되는 순간 깨진다.
upsert — MySQL/MariaDB 방식
SQL
- 유니크 키 위반이 감지될 때 갱신으로 전환된다. 즉 유니크 인덱스가 전제다.
created_at은UPDATE절에 넣지 않는다. 최초 시각이 보존돼야 멱등하다. Mongo의$setOnInsert와 같은 의도다 (MongoDB 갱신 연산자).
SQL
| 문법 | 동작 |
|---|---|
ON DUPLICATE KEY UPDATE | 지정 열만 갱신 — 권장 |
INSERT IGNORE | 충돌 무시. 다른 에러까지 삼키므로 주의 |
REPLACE INTO | DELETE + INSERT. FK·트리거가 함께 도는 부작용 |
UPDATE
SQL
WHERE없는UPDATE는 전체 행을 바꾼다. 운영 사고 1순위. 습관: 같은WHERE로SELECT COUNT(*)를 먼저 실행해 영향 행 수를 확인한다.
SQL
Rows matched와 Rows changed는 다르다. 값이 이미 같으면 matched만 늘고 changed는 0이다 (Mongo의 matched/modified와 같은 구분).
DELETE
SQL
| 문장 | 성질 |
|---|---|
DELETE | 행 단위, WHERE 가능, 롤백 가능, 느림 |
TRUNCATE TABLE t | 전체 삭제, DDL 취급, 매우 빠름, 롤백 불가, AUTO_INCREMENT 초기화 |
DROP TABLE t | 테이블 자체를 없앰 |
안전 습관
SQL
트랜잭션(ACID)으로 감싸면 되돌릴 기회가 생긴다. 대량 변경은 항상 이렇게 한다.
대량 삭제는 나눠서 한다. 한 번에 100만 행을 지우면 락과 복제 지연이 심해진다.
SQL
수명이 정해진 데이터라면 애초에 자동 만료를 쓰는 게 낫다 — Mongo의 TTL 인덱스가 그 역할이다.
한 줄 정리
INSERT ... ON DUPLICATE KEY UPDATE가 SQL의 upsert이고, WHERE 없는 UPDATE/DELETE가 최대 위험이며, 트랜잭션으로 감싸는 게 방어다.
관련
- SQL
- DDL과 제약조건
- 트랜잭션(ACID)
- 유니크 인덱스
- upsert
- MongoDB 갱신 연산자
- SQL ↔ MongoDB 문법 대조표