DML - 데이터 조작 (INSERT / UPDATE / DELETE)
DML 명령은 트랜잭션(Transaction) 내에서 실행되므로, COMMIT 전까지는 실제 반영되지 않고 ROLLBACK으로 되돌릴 수 있다.
INSERT (삽입)
-- 기본 문법: 컬럼 순서와 값 순서 일치해야 함
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);
-- 전체 컬럼 삽입 (컬럼 목록 생략 가능, 비권장)
INSERT INTO tbl_menu VALUES (NULL, '새메뉴', 12000, 4, 'Y');
-- AUTO_INCREMENT 컬럼에는 NULL 또는 DEFAULT 전달
-- 명시적 컬럼 지정 (권장)
INSERT INTO tbl_menu (menu_name, menu_price, category_code, orderable_status)
VALUES ('규동', 7000, 4, 'Y');
-- 여러 행 한 번에 삽입
INSERT INTO tbl_menu (menu_name, menu_price, category_code, orderable_status)
VALUES
('오므라이스', 9000, 4, 'Y'),
('카레라이스', 8000, 4, 'Y'),
('참치김밥', 5500, 6, 'Y');
-- SELECT 결과를 삽입 (INSERT INTO ... SELECT)
INSERT INTO tbl_menu_backup (menu_name, menu_price, category_code, orderable_status)
SELECT menu_name, menu_price, category_code, orderable_status
FROM tbl_menu
WHERE category_code = 4;
DEFAULT / NULL 삽입
INSERT INTO tbl_member (name, age, level)
VALUES ('홍길동', 20, DEFAULT); -- DEFAULT 키워드: 기본값 사용
-- 또는 컬럼 목록에서 아예 제외해도 됨
INSERT INTO tbl_member (name, age)
VALUES ('이순신', 30); -- level은 기본값으로 삽입
-- NULL 명시
INSERT INTO tbl_menu (menu_name, menu_price, category_code, orderable_status, description)
VALUES ('신메뉴', 9000, 4, 'Y', NULL);
UPDATE (수정)
-- 기본 문법
UPDATE 테이블명
SET 컬럼1 = 값1, 컬럼2 = 값2, ...
WHERE 조건;
-- 주의: WHERE 없으면 전체 행 수정!
-- 특정 메뉴 가격 수정
UPDATE tbl_menu
SET menu_price = 8000
WHERE menu_code = 10;
-- 여러 컬럼 동시 수정
UPDATE tbl_menu
SET
menu_name = '신메뉴',
menu_price = 9000,
orderable_status = 'N'
WHERE menu_code = 10;
-- 기존 값을 기반으로 수정
UPDATE tbl_menu
SET menu_price = menu_price * 1.1 -- 10% 인상
WHERE category_code = 4;
-- 서브쿼리 활용
UPDATE tbl_menu
SET orderable_status = 'N'
WHERE category_code = (
SELECT category_code FROM tbl_category WHERE category_name = '일식'
);
-- JOIN을 이용한 UPDATE (MySQL 전용)
UPDATE tbl_menu m
JOIN tbl_category c ON m.category_code = c.category_code
SET m.orderable_status = 'Y'
WHERE c.category_name = '한식';
DELETE (삭제)
-- 기본 문법
DELETE FROM 테이블명
WHERE 조건;
-- 주의: WHERE 없으면 전체 행 삭제!
-- 특정 행 삭제
DELETE FROM tbl_menu
WHERE menu_code = 10;
-- 조건으로 삭제
DELETE FROM tbl_menu
WHERE orderable_status = 'N';
-- 여러 조건
DELETE FROM tbl_menu
WHERE category_code = 4 AND menu_price < 5000;
-- 서브쿼리 활용
DELETE FROM tbl_menu
WHERE category_code IN (
SELECT category_code FROM tbl_category WHERE ref_category_code IS NULL
);
DELETE vs TRUNCATE
DELETE TRUNCATE
| 분류 | DML | DDL |
| WHERE 사용 | O | X (전체만) |
| ROLLBACK | 가능 | 불가능 (Auto COMMIT) |
| AUTO_INCREMENT 초기화 | X | O |
| 속도 | 느림 (로그 기록) | 빠름 |
TRUNCATE tbl_menu; -- 전체 삭제 + AUTO_INCREMENT 1부터 재시작
DELETE FROM tbl_menu; -- 전체 삭제 (AUTO_INCREMENT 유지, ROLLBACK 가능)
주요 실수와 주의사항
-- ❌ WHERE 빠진 UPDATE/DELETE (전체 영향)
UPDATE tbl_menu SET menu_price = 0; -- 전체 가격이 0으로!
DELETE FROM tbl_menu; -- 전체 삭제!
-- ✅ 실행 전 SELECT로 대상 확인 습관
SELECT * FROM tbl_menu WHERE category_code = 4;
-- 확인 후 DELETE/UPDATE로 교체
-- ❌ FK 제약으로 인한 삭제 실패
DELETE FROM tbl_category WHERE category_code = 4;
-- tbl_menu에 FK 참조가 있으면 에러!
-- → 자식 행 먼저 삭제하거나 ON DELETE CASCADE 설정 필요
'SKN_AI_33 > DB' 카테고리의 다른 글
| 06_DDL (0) | 2026.06.24 |
|---|---|
| 05_TCL 트랜잭션 (0) | 2026.06.24 |
| 03_JOIN (0) | 2026.06.24 |
| 02_DQL SELECT (0) | 2026.06.24 |
| 01_SQL 기초와 데이터 타입 (0) | 2026.06.24 |
