DML(Data Manipulation Language) 은
DB에 저장된 데이터(행) 를 추가/수정/삭제하는 SQL이다.
| 명령 | 목적 | 위험도 |
|---|---|---|
| INSERT | 새 행 추가 | 중 |
| UPDATE | 기존 행 변경 | 상 |
| DELETE | 행 삭제 | 최상 |
📌 SELECT는 엄밀하게 DQL(Data Query Language)에 속함.
INSERT INTO customers (email, name, phone)
VALUES ('user21@example.com', 'Hong Gil', '010-1111-0021');
INSERT INTO products (sku, name, category, price, stock)
VALUES
('SKU-2001','USB Fan','DEVICE',15000,50),
('SKU-2002','Desk Pad','LIVING',12000,80);
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;
재고 누적/동기화에 자주 사용
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);
INSERT INTO orders (customer_id, status) VALUES (1, 'CREATED');
SET @oid := LAST_INSERT_ID();
SELECT @oid AS new_order_id;
📌 LAST_INSERT_ID()는 세션 단위라 동시성에서도 안전.
UPDATE customers
SET phone = '010-9999-9999'
WHERE customer_id = 1;
UPDATE orders
SET status = 'CANCELLED'
WHERE status = 'CREATED'
AND ordered_at < NOW() - INTERVAL 7 DAY;
→ orders(status, ordered_at) 같은 인덱스가 없으면 스캔 커짐
결제 승인 → 주문 상태 변경
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';
DELETE FROM payments
WHERE payment_id = 3;
DELETE FROM orders
WHERE status = 'CANCELLED'
AND ordered_at < NOW() - INTERVAL 30 DAY;
현재 스키마 기준:
orders → customers : ON DELETE RESTRICTorder_items → orders : ON DELETE CASCADEpayments → 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;
실제 서비스에서는 물리 DELETE 대신 상태값 변경을 많이 쓴다.
UPDATE customers
SET status = 'DELETED'
WHERE customer_id = 20;
장점: