AD JB Toolbox 01

MariaDB 강좌 / INSERT로 한 행과 여러 행 추가하기

INSERT는 테이블에 새로운 행을 추가하는 SQL 문입니다. 열 이름과 값의 대응을 명시하고 VALUES 뒤에 괄호로 묶은 값 목록을 한 개 또는 여러 개 쓰면 되며, 실행 후에는 실제로 저장된 값과 행 수를 확인해야 합니다.

행을 추가하기 전에 열과 값의 대응 정하기

상품 하나를 한 행, 상품 번호·이름·분류·가격·재고·메모를 각각 하나의 열로 저장합니다. INSERT의 열 목록과 VALUES 안의 값은 이름이 아니라 위치로 대응하므로, 개수와 순서를 함께 맞춰야 합니다. 가격과 재고를 모두 숫자로 쓴다고 자리를 바꿔도 되는 것은 아닙니다. 추가 대상의 구조는 CREATE TABLE로 테이블 구조 정의하기에서 확인하고, 삽입 뒤 필요한 열을 읽어 대조하는 방법은 SELECT로 열 선택하기: 별칭·계산식·DISTINCT에서 구체화합니다. 파일의 많은 행을 적재하는 작업은 CSV 가져오기·내보내기: 경로·권한·문자 인코딩처럼 입력 형식 검증도 필요합니다.

입력 요소 예 확인할 점
테이블 products_13_lab 현재 데이터베이스가 shopcourse인지
열 목록 product_name, price 값 목록과 같은 개수·순서인지
문자열 '노트' 작은따옴표로 감싸는지
숫자 3500.00 단위·쉼표를 섞지 않았는지
값 없음 NULL 문자열 'NULL'과 구분했는지

열 목록을 생략하고 테이블의 모든 열 순서에 의존하는 문장은 구조가 바뀌면 의미가 달라질 수 있습니다. 학습 예제와 프로그램 모두 입력 열을 명시하는 습관이 좋습니다. 문자열에 작은따옴표를 넣을 때는 'O''Brien'처럼 겹쳐 씁니다. 프로그램에서 외부 입력을 받을 때는 문자열 결합 대신 매개변수 쿼리를 사용합니다.

한 행과 여러 행을 넣는 전체 예제

명령줄 클라이언트에서 course_user로 학습용 서버에 접속하고 shopcourse 데이터베이스를 준비합니다. 접속과 UTF-8 SQL 파일 실행 방법은 명령줄 클라이언트와 SQL 파일 실행 안내를 참고하세요. 아래 코드는 운영 서버가 아닌 연습 환경에서 실행합니다.

이 글은 products_13_lab이라는 독립된 실습 테이블을 사용합니다. 이전 강좌의 products 등 기존 테이블에는 손대지 않습니다. SELECT VERSION(), DATABASE();와 SHOW TABLES LIKE 'products_13_lab';로 서버·선택한 데이터베이스·이름 중복을 먼저 확인합니다. 같은 이름이 이미 있으면 정의와 데이터를 확인하고, 이 글에서 만든 연습 데이터인지 판단한 뒤 마지막 절의 반복 방법을 따르세요.

테이블을 만든 뒤 첫 상품은 한 문장으로, 나머지 다섯 상품은 하나의 다중 행 INSERT로 넣습니다. 예제 결과를 고정하기 위해 첫 여섯 번호는 직접 지정하고, 자동 번호는 뒤의 별도 실습에서 확인합니다. 구조 정의의 의미는 CREATE TABLE로 테이블 구조 정의하기에서 살펴볼 수 있습니다.

USE shopcourse;
CREATE TABLE products_13_lab (
  product_id INT NOT NULL AUTO_INCREMENT,
  product_name VARCHAR(100) NOT NULL,
  category VARCHAR(30) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  stock INT NOT NULL DEFAULT 0,
  note VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (product_id),
  CONSTRAINT ck_p13_price CHECK (price >= 0),
  CONSTRAINT ck_p13_stock CHECK (stock >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO products_13_lab
  (product_id, product_name, category, price, stock, note)
VALUES (1, '노트', '문구', 3500.00, 20, NULL);
SELECT ROW_COUNT() AS inserted_rows;
INSERT INTO products_13_lab
  (product_id, product_name, category, price, stock, note)
VALUES
  (2, '볼펜', '문구', 1500.00, 0, ''),
  (3, '머그컵', '생활', 8000.00, 12, '선물 포장'),
  (4, '스탠드', '생활', 25000.00, 5, NULL),
  (5, '파일', '문구', 1500.00, 50, ''),
  (6, '케이블', '전자', 8000.00, 0, '호환 확인');
SELECT ROW_COUNT() AS inserted_rows;

각 INSERT 바로 뒤의 ROW_COUNT()는 차례로 1과 5가 됩니다. 다른 SELECT를 사이에 넣으면 최근 문장이 달라지므로, 영향을 받은 행 수는 변경 직후 읽습니다. 두 INSERT는 기본 autocommit=1인 연결에서는 각각 확정될 수 있으므로 둘째 문장이 실패했다고 앞의 첫 행까지 모두 취소된다고 생각하면 안 됩니다.

저장된 행을 읽어 입력 결과 확인하기

SELECT product_id, product_name, category, price, stock, note FROM products_13_lab ORDER BY product_id;
번호 상품 분류 가격 재고 메모
1 노트 문구 3500.00 20 NULL
2 볼펜 문구 1500.00 0 빈 문자열
3 머그컵 생활 8000.00 12 선물 포장
4 스탠드 생활 25000.00 5 NULL
5 파일 문구 1500.00 50 빈 문자열
6 케이블 전자 8000.00 0 호환 확인

성공 메시지만 확인하지 말고 가격·분류·재고가 의도한 열에 들어갔는지 비교합니다. NULL과 빈 메모는 클라이언트 화면에서 비슷하게 보일 수 있으므로 note IS NULL로 구별할 수 있습니다. 한글이 깨지면 데이터를 반복 입력하기 전에 파일의 UTF-8 인코딩과 클라이언트의 문자 집합을 먼저 확인합니다.

자동 번호·기본값·생략한 열 확인하기

이번에는 번호·재고·메모를 열 목록에서 제외합니다. 같은 연결에서 아래 블록 전체를 실행하면 새 번호와 stock=0, note_is_null=1을 확인하고 추가 행을 되돌립니다. 새로 만든 테이블을 예제 순서대로 실행하면 generated_id는 7입니다. 이미 다른 입력이나 실패가 있었다면 번호가 달라도 기본값과 저장 결과를 중심으로 확인합니다.

START TRANSACTION;
INSERT INTO products_13_lab (product_name, category, price)
VALUES ('연습 상품', '문구', 2000.00);
SELECT LAST_INSERT_ID() AS generated_id;
SELECT product_id, stock, note IS NULL AS note_is_null
FROM products_13_lab WHERE product_id = LAST_INSERT_ID();
ROLLBACK;
SELECT COUNT(*) AS remaining_rows FROM products_13_lab;

입력을 생략한 stock에는 DEFAULT 0이 적용되고 note에는 DEFAULT NULL이 적용됩니다. NOT NULL 열에 명시적으로 NULL을 넣는 것은 생략과 다릅니다. NULL·기본값·제약 조건 안내에서 이 차이를 설명합니다. 자동 증가 번호는 취소 후에도 빈 구간이 생길 수 있으므로, ROLLBACK 뒤 다음 번호가 다시 7일 것이라고 가정하지 않습니다.

실패하는 입력을 정상 예제와 분리해서 확인하기

정상 행 여섯 개를 넣은 뒤 아래 문장을 하나씩 실행합니다. 첫 문장은 기본키 1을 중복 사용하고, 둘째 문장은 열 두 개에 값 한 개만 대응하며, 셋째 문장은 필수 상품명에 NULL을 넣습니다. 각각 중복 키·열 개수 불일치·NULL 금지 오류가 예상됩니다.

INSERT INTO products_13_lab (product_id, product_name, category, price)
VALUES (1, '중복 상품', '문구', 1000);

INSERT INTO products_13_lab (product_name, price) VALUES ('값 부족');

INSERT INTO products_13_lab (product_name, category, price)
VALUES (NULL, '문구', 1000);

의도한 오류를 한 파일에 모아 정상 예제 중간에 실행하면 클라이언트 옵션에 따라 뒤의 문장이 실행되지 않을 수 있습니다. 오류마다 SELECT COUNT(*) FROM products_13_lab;가 6인지 확인하고, 명령이 거절된 원인을 고칩니다. 오류를 숨기기 위해 INSERT IGNORE나 기존 행을 대체할 수 있는 REPLACE로 바꾸지 않습니다.

실행 환경과 반복 입력 점검하기

데이터 타입을 벗어난 값의 처리에는 SQL 모드가 영향을 줍니다. 이 글의 가격과 재고는 선언한 범위 안의 정상 입력을 사용하며, 경고가 나오면 SHOW WARNINGS;를 해당 문장 직후 확인합니다. 많은 행을 한 번에 넣는 문장은 통신 횟수를 줄일 수 있지만 한 문장의 크기 제한까지 없애 주지는 않습니다. 대량 가져오기는 별도의 절차로 다룹니다. MariaDB INSERT 공식 문서에서 열 목록과 다중 행 문법을 확인할 수 있습니다.

다시 실습하려면 SELECT DATABASE();, SHOW CREATE TABLE products_13_lab;와 저장된 행을 확인합니다. 보관할 데이터가 없는 이 글의 연습 테이블이 확실할 때만 아래 문장으로 지운 뒤 준비 코드를 다시 실행합니다. DROP TABLE은 구조와 데이터를 함께 없애며 일반적인 ROLLBACK으로 취소되지 않습니다.

DROP TABLE shopcourse.products_13_lab;
같은 카테고리의 다른 글
MariaDB 강좌 / mariadb-dump로 데이터베이스 백업하기

MariaDB 강좌 / mariadb-dump로 데이터베이스 백업하기

별도 주문 실습 DB를 준비해 mariadb-dump로 새 SQL 백업 파일을 만듭니다. 종료 코드·해시·문자 인코딩, InnoDB 스냅샷과 동시 DDL의 한계, 객체·권한·별도 복원 검증 기준을 설명합니다.

MariaDB 강좌 / UNION·UNION ALL로 조회 결과 합치기

MariaDB 강좌 / UNION·UNION ALL로 조회 결과 합치기

UNION과 UNION ALL을 겹치는 서울 고객·결제 고객 목록으로 비교합니다. 출처 열이 중복 기준을 바꾸는 이유, 열 위치·타입·전체 정렬의 조건을 설명합니다.

MariaDB 강좌 / 명령줄 클라이언트로 접속하고 SQL 파일 실행하기

MariaDB 강좌 / 명령줄 클라이언트로 접속하고 SQL 파일 실행하기

터미널 명령과 SQL 입력 위치를 구분하고 학습 계정으로 접속합니다. UTF-8 SQL 파일의 SOURCE 실행, 예상 결과, 오류 중단·한글 표시·경로 문제를 함께 확인합니다.

MariaDB / VIEW

MariaDB / VIEW

VIEW는 가상의 테이블입니다. 실제로 데이터를 저장하지 않고, 기존의 하나 이상의 테이블을 기반으로 한 쿼리 결과를 테이블처럼 사용할 수 있게 해줍니다. 뷰는 복잡한 쿼리를 단순화하고, 보안 및 데이터 관리에 유용하게 사용됩니다.

MariaDB 강좌 / EXPLAIN으로 실행 계획 읽고 인덱스 전후 비교하기

MariaDB 강좌 / EXPLAIN으로 실행 계획 읽고 인덱스 전후 비교하기

1000행 실습으로 인덱스 전후 EXPLAIN과 실제 반환 행을 비교합니다. ANALYZE FORMAT=JSON의 실행 정보와 통계 갱신을 구분하고 결과·환경을 기록합니다.

MariaDB 강좌 / 저장 프로시저·함수·트리거의 차이와 사용 방법

MariaDB 강좌 / 저장 프로시저·함수·트리거의 차이와 사용 방법

프로시저·함수·트리거의 호출 방식과 권한 차이를 재고·금액·변경 기록 예제로 비교합니다. 전체 생성 SQL과 실행 결과, 롤백·확정·오류 확인 및 객체 정리 방법을 제공합니다.

MariaDB 강좌 / 인덱스 만들기: 단일·복합 인덱스와 열 순서

MariaDB 강좌 / 인덱스 만들기: 단일·복합 인덱스와 열 순서

기존 키를 조회한 뒤 고객·날짜 복합 인덱스를 만들고 같은 조회 결과를 확인합니다. 열 순서·범위·커버링, 쓰기 비용·중복 키·외래키 지원 인덱스의 주의점을 설명합니다.

MariaDB 강좌 / 백업을 별도 데이터베이스에 복원하고 검증하기

MariaDB 강좌 / 백업을 별도 데이터베이스에 복원하고 검증하기

새 원본과 별도 빈 DB를 준비해 덤프를 복원하고 객체·행 수·키·업무 합계를 비교합니다. 파일 안의 DB 전환·삭제 문장, 클라이언트 호환성과 부분 복원 실패의 대응을 설명합니다.

MariaDB 강좌 / INNER JOIN으로 서로 연결된 데이터 조회하기

MariaDB 강좌 / INNER JOIN으로 서로 연결된 데이터 조회하기

고객과 주문을 INNER JOIN으로 연결하고 결과 한 행의 의미를 확인합니다. ON과 WHERE, 테이블 별칭, 일대다로 늘어나는 행과 조건 없는 곱집합을 비교합니다.

MariaDB 강좌 / 숫자 계산과 타입 변환: ROUND·CAST

MariaDB 강좌 / 숫자 계산과 타입 변환: ROUND·CAST

ROUND와 CAST를 할인 금액·정확한 소수·숫자 문자열로 실습합니다. 반올림 시점, 앞자리 0 손실, 잘림 경고와 SQL 모드에 따른 저장 동작의 차이를 설명합니다.