데이터를 추가·수정·삭제하는 DML과 UPSERT 패턴.
INSERT · UPDATE · DELETE
지금까지는 데이터를 읽기만 했습니다. 이제 데이터를 직접 추가하고(INSERT), 바꾸고(UPDATE), 지우는(DELETE) 방법을 배웁니다. 데이터를 변경하는 이 명령들을 DML(Data Manipulation Language) 이라고 합니다.
학습 목표
INSERT로 한 건 또는 여러 건을 추가합니다.UPDATE로 조건에 맞는 행을 수정합니다.DELETE로 행을 삭제합니다.ON DUPLICATE KEY UPDATE와REPLACE로 UPSERT를 구현합니다.
INSERT — 데이터 추가
-- 단건 삽입
INSERT INTO users (name, email, city)
VALUES ('홍길동', 'hong@example.com', 'Seoul');
-- 여러 건 한 번에
INSERT INTO users (name, email, city) VALUES
('김철수', 'kim@example.com', 'Busan'),
('이영희', 'lee@example.com', 'Seoul'),
('박민수', 'park@example.com', 'Daegu');
열 목록을 생략하면 테이블 정의 순서대로 모든 열에 값을 넣어야 합니다. 명시적으로 열을 적는 편이 안전합니다.
-- 다른 테이블의 조회 결과를 그대로 삽입
INSERT INTO vip_users (user_id, total)
SELECT user_id, SUM(amount)
FROM orders
GROUP BY user_id
HAVING SUM(amount) >= 1000000;
💡 TIP —
AUTO_INCREMENTPK는 값을 지정하지 않으면 자동으로 채워집니다. 방금 삽입된 자동 증가 값은SELECT LAST_INSERT_ID();로 가져올 수 있습니다.
UPDATE — 데이터 수정
UPDATE users
SET city = 'Incheon',
updated_at = NOW()
WHERE id = 5;
SET 에 바꿀 열과 값을 나열하고, WHERE 로 대상 행을 지정합니다. 기존 값을 활용한 계산도 가능합니다.
-- 모든 상품 가격을 10% 인상
UPDATE products
SET price = price * 1.1;
⚠️ 주의 —
WHERE없는UPDATE/DELETE는 테이블의 모든 행에 적용됩니다. 실행 전 같은 조건으로SELECT를 먼저 돌려 영향 범위를 확인하는 습관을 들이세요. (SET SQL_SAFE_UPDATES = 1;로 PK 조건 없는 변경을 막을 수도 있습니다.)
DELETE — 데이터 삭제
-- 조건에 맞는 행 삭제
DELETE FROM orders
WHERE ordered_at < '2020-01-01';
-- 전체 삭제
DELETE FROM logs; -- 행을 하나씩 삭제 (롤백 가능)
TRUNCATE TABLE logs; -- 통째로 비움 (빠르지만 롤백 불가, AUTO_INCREMENT 초기화)
전체를 비울 때 TRUNCATE 가 훨씬 빠르지만 트랜잭션 롤백이 안 되고 트리거도 동작하지 않으니 용도를 구분하세요.
UPSERT — 있으면 수정, 없으면 삽입
PK나 UNIQUE 키가 충돌할 때 동작을 지정할 수 있습니다.
-- 같은 이메일이 이미 있으면 도시만 갱신
INSERT INTO users (email, name, city)
VALUES ('hong@example.com', '홍길동', 'Busan')
ON DUPLICATE KEY UPDATE
city = VALUES(city);
VALUES(열) 은 방금 삽입하려던 값을 가리킵니다. 한편 REPLACE 는 충돌 시 기존 행을 삭제하고 새로 삽입합니다.
REPLACE INTO users (id, name, city)
VALUES (5, '홍길동', 'Busan');
| 방식 | 동작 |
|---|---|
ON DUPLICATE KEY UPDATE | 충돌 시 지정한 열만 갱신 (기존 행 유지) |
REPLACE | 충돌 시 기존 행 삭제 후 재삽입 (다른 열은 기본값으로) |
⚠️ 주의 —
REPLACE는 행을 삭제 후 새로 넣으므로, 명시하지 않은 열은 기본값으로 초기화되고 새AUTO_INCREMENTid가 부여될 수 있습니다. 일부 열만 바꾸려면ON DUPLICATE KEY UPDATE가 안전합니다.
요약
INSERT ... VALUES로 단건/다건을 추가하고,SELECT결과도 삽입할 수 있습니다.UPDATE ... SET ... WHERE로 대상 행만 수정합니다.DELETE는 조건 삭제,TRUNCATE는 전체 비우기(롤백 불가)입니다.WHERE없는 수정/삭제는 전체에 적용되니 항상 조건을 확인합니다.- UPSERT는
ON DUPLICATE KEY UPDATE(권장) 또는REPLACE로 구현합니다.
연습문제
products에 이름 '노트북', 가격 1500000인 상품을 추가하세요.- id가 3인 사용자의 도시를 'Seoul'로 바꾸세요.
- 2020년 이전 주문을 모두 삭제하세요.
- 이메일이 같으면 이름을 갱신하고, 없으면 새로 추가하는 쿼리를 작성하세요.
힌트 — 1번
INSERT, 2번UPDATE ... WHERE id = 3, 3번DELETE ... WHERE, 4번ON DUPLICATE KEY UPDATE.
💡 연습문제 풀이
불러오는 중…
댓글 0
“MySQL” 강좌에 대한 댓글입니다.