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 / VIEW

MariaDB / VIEW

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

MariaDB 강좌 / NULL·기본값·NOT NULL·CHECK로 입력 조건 정하기

MariaDB 강좌 / NULL·기본값·NOT NULL·CHECK로 입력 조건 정하기

NULL·빈 문자열·0·입력 생략을 구분하고 DEFAULT·NOT NULL·CHECK의 역할을 실습합니다. nullable 열의 CHECK 예외, 실패 입력, 제약 이름과 설정 복원 방법을 설명합니다.

MariaDB 강좌 / CASE로 조건별 값과 집계 만들기

MariaDB 강좌 / CASE로 조건별 값과 집계 만들기

CASE 조건의 순서와 ELSE를 상품 재고 상태로 실습합니다. SUM·COUNT 안의 조건부 집계, 0과 NULL의 차이, WHERE로 그룹을 없애는 경우와 0을 표시하는 경우를 설명합니다.

MariaDB 강좌 / 여러 테이블 JOIN하기: 중복 행과 집계 오류 확인

MariaDB 강좌 / 여러 테이블 JOIN하기: 중복 행과 집계 오류 확인

고객·주문·상세·상품을 JOIN하고 행 증가에 따른 배송비 중복 합산을 확인합니다. COUNT DISTINCT와 SUM DISTINCT의 차이, 주문별 선집계로 올바른 금액을 얻는 방법을 설명합니다.

MariaDB 강좌 / LEFT JOIN으로 연결되지 않은 행도 조회하기

MariaDB 강좌 / LEFT JOIN으로 연결되지 않은 행도 조회하기

LEFT JOIN으로 주문 없는 고객을 유지하고 paid 주문 수를 0까지 표시합니다. ON·WHERE의 필터 위치, COUNT(*)의 함정, NULL 기본키로 미일치 행을 찾는 기준을 실습합니다.

MariaDB 강좌 / 서브쿼리·EXISTS·NOT EXISTS로 조건 표현하기

MariaDB 강좌 / 서브쿼리·EXISTS·NOT EXISTS로 조건 표현하기

평균값 서브쿼리와 EXISTS·NOT EXISTS를 상품·고객·주문으로 실습합니다. 한 값의 반환 조건, 상관 키 누락, paid 주문 부재의 정의와 NOT IN의 NULL 함정을 설명합니다.

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

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

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

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

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

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

MariaDB 강좌 / 첫 실습: 상품 테이블을 만들고 데이터를 넣어 조회하기

MariaDB 강좌 / 첫 실습: 상품 테이블을 만들고 데이터를 넣어 조회하기

상품 세 건을 저장하는 전체 SQL로 테이블 생성·입력·조회 과정을 실습합니다. 구조와 행 수, 가격·재고 조건의 예상 결과를 확인하고 반복 입력 오류와 실습 테이블 초기화 범위를 구분합니다.

MariaDB 강좌 / CREATE TABLE로 테이블 구조 정의하기

MariaDB 강좌 / CREATE TABLE로 테이블 구조 정의하기

상품 테이블을 예로 열·타입·기본값·기본키·저장 엔진을 정의하고 실제 생성 결과를 확인합니다. 기존 테이블 처리, IF NOT EXISTS의 한계와 안전한 반복 실습 방법도 설명합니다.