dev.syw

데이터를 추가·수정·삭제하는 DML과 UPSERT 패턴.

INSERT · UPDATE · DELETE

지금까지는 데이터를 읽기만 했습니다. 이제 데이터를 직접 추가하고(INSERT), 바꾸고(UPDATE), 지우는(DELETE) 방법을 배웁니다. 데이터를 변경하는 이 명령들을 DML(Data Manipulation Language) 이라고 합니다.

학습 목표

  • INSERT 로 한 건 또는 여러 건을 추가합니다.
  • UPDATE 로 조건에 맞는 행을 수정합니다.
  • DELETE 로 행을 삭제합니다.
  • ON DUPLICATE KEY UPDATEREPLACE 로 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;

💡 TIPAUTO_INCREMENT PK는 값을 지정하지 않으면 자동으로 채워집니다. 방금 삽입된 자동 증가 값은 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_INCREMENT id가 부여될 수 있습니다. 일부 열만 바꾸려면 ON DUPLICATE KEY UPDATE 가 안전합니다.

요약

  • INSERT ... VALUES 로 단건/다건을 추가하고, SELECT 결과도 삽입할 수 있습니다.
  • UPDATE ... SET ... WHERE 로 대상 행만 수정합니다.
  • DELETE 는 조건 삭제, TRUNCATE 는 전체 비우기(롤백 불가)입니다.
  • WHERE 없는 수정/삭제는 전체에 적용되니 항상 조건을 확인합니다.
  • UPSERT는 ON DUPLICATE KEY UPDATE(권장) 또는 REPLACE 로 구현합니다.

연습문제

  1. products 에 이름 '노트북', 가격 1500000인 상품을 추가하세요.
  2. id가 3인 사용자의 도시를 'Seoul'로 바꾸세요.
  3. 2020년 이전 주문을 모두 삭제하세요.
  4. 이메일이 같으면 이름을 갱신하고, 없으면 새로 추가하는 쿼리를 작성하세요.

힌트 — 1번 INSERT, 2번 UPDATE ... WHERE id = 3, 3번 DELETE ... WHERE, 4번 ON DUPLICATE KEY UPDATE.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

MySQL” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.