[Database] MySQL 실습(5) - DML : INSERT / UPDATE / DELETE

우유·2026년 2월 3일

[Cloud] Database

목록 보기
8/28

5. DML : INSERT / UPDATE / DELETE

1) DML이란?

DML(Data Manipulation Language) 은

DB에 저장된 데이터(행) 를 추가/수정/삭제하는 SQL이다.

명령목적위험도
INSERT새 행 추가
UPDATE기존 행 변경
DELETE행 삭제최상

📌 SELECT는 엄밀하게 DQL(Data Query Language)에 속함.


2) INSERT (추가)

2-1) 기본 INSERT (권장: 컬럼 명시)

INSERT INTO customers (email, name, phone)
VALUES ('user21@example.com', 'Hong Gil', '010-1111-0021');
  • 지정하지 않은 컬럼은 DEFAULT / NULL 적용
  • created_at은 DEFAULT CURRENT_TIMESTAMP로 자동 입력

2-2) 다중 행 INSERT (성능상 유리)

INSERT INTO products (sku, name, category, price, stock)
VALUES
('SKU-2001','USB Fan','DEVICE',15000,50),
('SKU-2002','Desk Pad','LIVING',12000,80);

2-3) INSERT + SELECT (조회 결과를 삽입)

INSERT INTO orders (customer_id, status, ordered_at, total_amount)
SELECT customer_id, 'CREATED', NOW(), 0
FROM customers
WHERE created_at >= NOW() - INTERVAL 7 DAY;

2-4) 중복 처리 패턴 ①: UPSERT (MySQL)

재고 누적/동기화에 자주 사용

INSERT INTO products (sku, name, category, price, stock)
VALUES ('SKU-1001','USB-C Cable 1m','ACCESSORY',9000,10)
ON DUPLICATE KEY UPDATE
  stock = stock + VALUES(stock);
  • UNIQUE(sku) 충돌 시 UPDATE 수행

2-5) INSERT 후 생성된 ID 받기 (AUTO_INCREMENT)

INSERT INTO orders (customer_id, status) VALUES (1, 'CREATED');
SET @oid := LAST_INSERT_ID();

SELECT @oid AS new_order_id;

📌 LAST_INSERT_ID()세션 단위라 동시성에서도 안전.


3) UPDATE (수정)

3-1) 가장 안전한 UPDATE: PK로 단건 수정

UPDATE customers
SET phone = '010-9999-9999'
WHERE customer_id = 1;
  • 안전한 이유: 대상 행이 명확함

3-2) 조건 UPDATE (WHERE 필수)

UPDATE orders
SET status = 'CANCELLED'
WHERE status = 'CREATED'
  AND ordered_at < NOW() - INTERVAL 7 DAY;
  • 이런 UPDATE는 인덱스(where절) 유무에 따라 성능이 갈림

orders(status, ordered_at) 같은 인덱스가 없으면 스캔 커짐


3-3) JOIN UPDATE

결제 승인 → 주문 상태 변경

UPDATE orders o
JOIN payments p ON p.order_id = o.order_id
SET o.status = 'PAID'
WHERE p.status = 'APPROVED'
  AND o.status = 'CREATED';
  • 두 테이블의 관계 기반으로 업데이트
  • 조인키 인덱스(FK 인덱스)가 매우 중요

4) DELETE (삭제)

4-1) 단건 DELETE (PK 기준)

DELETE FROM payments
WHERE payment_id = 3;

4-2) 조건 DELETE

DELETE FROM orders
WHERE status = 'CANCELLED'
  AND ordered_at < NOW() - INTERVAL 30 DAY;
  • 운영에서는 대량 삭제 대신 “아카이빙/논리삭제”가 흔함

4-3) FK와 DELETE: CASCADE / RESTRICT 이해

현재 스키마 기준:

  • orders → customers : ON DELETE RESTRICT
    • 고객 삭제 시, 주문 있으면 삭제 불가
  • order_items → orders : ON DELETE CASCADE
    • 주문 삭제 시, 주문상세 자동 삭제
  • payments → orders : ON DELETE CASCADE
    • 주문 삭제 시, 결제 자동 삭제

확인 실습

-- (1) 주문이 있는 고객 삭제 시도 → 실패(Restrict)
DELETE FROM customers WHERE customer_id = 1;

-- (2) 주문 삭제 → order_items/payments 연쇄 삭제(Cascade)
DELETE FROM orders WHERE order_id = 1;

5) 논리 삭제(Soft Delete) 패턴

실제 서비스에서는 물리 DELETE 대신 상태값 변경을 많이 쓴다.

UPDATE customers
SET status = 'DELETED'
WHERE customer_id = 20;

장점:

  • 복구 가능
  • 감사/추적 가능
  • FK 충돌 줄어듦
profile
Front-end Developer, Cloud Engineer

0개의 댓글