MySQL 첫 테이블 만들기: CREATE TABLE 문법

핵심 요약

  • MySQL 첫 테이블 생성은 데이터베이스 학습의 기초이자 데이터를 담을 그릇(테이블)을 준비하는 과정입니다.
  • 테이블은 엑셀처럼 보이지만, 스키마(설계도)로 데이터 타입/규칙을 강제해 데이터 무결성을 지킵니다.
  • CREATE TABLE 문법 + 데이터 타입 + 제약 조건을 이해하면 “꼬이지 않는 데이터 구조”를 만들 수 있습니다.
  • 실무에서는 NOT NULL 우선, AUTO_INCREMENT, InnoDB(ENGINE), COMMENT 같은 기본 옵션을 함께 챙깁니다.

목차

도입: 데이터베이스 세계로의 첫걸음

MySQL 첫 테이블 만들기는 데이터베이스 학습의 가장 설레는 첫걸음입니다. 요리를 하려면 재료를 담을 그릇이 필요하듯, 데이터를 저장하려면 데이터를 담을 ‘그릇’인 테이블이 반드시 필요하기 때문입니다.

이 글은 2026년 1월 5일 기준으로 MySQL 기준으로 설명합니다. 참고로 CREATE TABLE의 큰 구조는 표준 SQL과 비슷하지만, AUTO_INCREMENT, ENGINE 같은 일부 옵션은 MySQL 전용이라 다른 DB(PostgreSQL/Oracle 등)에서는 문법이 다를 수 있습니다.

데이터를 담는 그릇으로서 데이터베이스 테이블을 표현한 이미지

테이블의 정체: 엑셀과 비교하여 이해하기

데이터베이스가 낯설게 느껴진다면 엑셀을 떠올려보세요. 핵심 차이는 스키마(Schema)입니다. 엑셀은 자유롭게 입력해도 되지만, 데이터베이스는 “여긴 숫자만”, “여긴 날짜만” 같은 규칙을 엄격하게 지켜서 데이터가 깨지는 걸 막습니다.

[표 1] 엑셀 vs 데이터베이스 용어 비교

구분 엑셀(Excel) 데이터베이스(DB) 설명
저장소 시트 (Sheet) 테이블 (Table) 데이터를 담는 가장 기본 단위
세로줄 열 (Column) 컬럼/속성 (Column/Attribute) 데이터 항목 (예: 이름, 나이, 가격)
가로줄 행 (Row) 레코드 (Row/Record) 실제 데이터 1건
규칙 없음 (자유) 스키마 (Schema) 데이터 타입/제약조건 설계도

💡 에디터의 팁
스키마는 쉽게 말해 “건물 설계도”입니다. 설계도가 튼튼해야 데이터가 꼬이지 않고 오래 씁니다.

핵심 문법: CREATE TABLE 해부하기

CREATE TABLE은 “테이블을 만들고, 컬럼을 이런 규칙으로 구성해라”라는 명령입니다.

기본 문법 골격

CREATE TABLE 테이블이름 (
  컬럼명1 데이터타입 제약조건,
  컬럼명2 데이터타입 제약조건,
  ...
);

실무 작명 규칙 (Naming Convention)

  • snake_case 권장: user_info, order_detail
  • 소문자 통일 권장: OS/서버 환경에 따라 대소문자 정책이 달라져도 안전합니다.

에러 방지 꿀팁: IF NOT EXISTS

CREATE TABLE IF NOT EXISTS members ( ... );
-- 해석: members 테이블이 없을 때만 새로 만들어라.

재료 준비: 데이터 타입 선택 기준

데이터 타입은 “아무거나” 고르면 나중에 고생합니다. 저장공간/성능/정확도에 직접 영향을 줍니다. (아래는 MySQL 기준)

문자열: CHAR vs VARCHAR

  • CHAR(n): 고정 길이(항상 n칸 확보). 길이가 늘 일정한 값(국가코드, Y/N 등)에 적합
  • VARCHAR(n): 가변 길이(쓴 만큼만). 이름/이메일처럼 길이가 들쭉날쭉한 값에 적합

숫자: INT만 쓰지 말고 “크기”를 맞추기

  • TINYINT/SMALLINT/INT/BIGINT는 저장공간과 표현 가능한 범위가 다릅니다.
  • 예: 상태값(0/1/2)은 TINYINT, 일반적인 PK는 BIGINT까지도 고려
  • 음수가 절대 없다면 UNSIGNED를 고려하면 범위를 더 넓게 쓸 수 있습니다.

💡 에디터의 팁
타입 선택은 “정확도/공간/미래 확장”의 균형입니다. 초보 단계에서는 완벽한 최적화보다 명확한 의미와 일관성을 우선하세요.

규칙 세우기: 제약 조건 + NULL/NOT NULL 원칙

주요 제약 조건 요약

제약 조건 설명 예시
PRIMARY KEY 고유 식별자(중복 불가, 보통 NULL 불가) member_id, order_id
NOT NULL 반드시 값이 있어야 함 name, email
UNIQUE 중복 방지 email
DEFAULT 값을 안 넣으면 자동으로 들어가는 기본값 created_at 기본 현재시간

NULL vs NOT NULL: 실무 설계 원칙

  • 원칙: 기본은 NOT NULL로 두고, 정말 “비어도 되는 값”만 NULL을 허용합니다.
  • 이유: 데이터가 쌓일수록 “이 값이 비어도 되는 건지”가 혼란을 만들고, 조건문(WHERE)도 복잡해지기 쉽습니다.
  • 예: bio(자기소개)는 없어도 되니 NULL 가능, email은 서비스 핵심키면 NOT NULL 권장

실전 예제: 쇼핑몰 ‘회원(members)’ 테이블 만들기

이제 실제로 가장 자주 나오는 “회원 테이블”을 만들어봅니다. 이번 예제는 초보자가 바로 실무 감각을 잡도록 AUTO_INCREMENT, InnoDB, COMMENT까지 같이 넣었습니다.

완성 SQL (MySQL 기준)

CREATE TABLE IF NOT EXISTS members (
  member_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '회원 PK',
  name      VARCHAR(50)     NOT NULL COMMENT '이름',
  email     VARCHAR(100)    NOT NULL COMMENT '이메일(중복 금지)',
  join_date DATE            NOT NULL DEFAULT (CURRENT_DATE) COMMENT '가입일(자동)',
  bio       TEXT            NULL COMMENT '자기소개(선택)',

  PRIMARY KEY (member_id),
  UNIQUE KEY uk_members_email (email)
)
ENGINE=InnoDB
COMMENT='쇼핑몰 회원';

💡 에디터의 팁
DEFAULT (CURRENT_DATE)처럼 “함수/표현식 기본값”은 MySQL에서 괄호가 필요한 경우가 많습니다. 괄호 없이 쓰면 버전에 따라 에러가 날 수 있어요.

실무 디테일 1: ENGINE=InnoDB (스토리지 엔진)

MySQL에서 테이블은 “어떤 엔진(저장 방식)”으로 저장할지 선택할 수 있는데, 기본 엔진은 보통 InnoDB입니다. InnoDB는 트랜잭션(ACID)과 안정성을 지원하는 범용 엔진이라 실무 기본값으로 사용됩니다.

내 서버의 기본 엔진 확인

SELECT @@default_storage_engine;
SHOW ENGINES;

실무 디테일 2: AUTO_INCREMENT가 초기화되지 않는 이유/해결

초보자가 자주 놀라는 포인트: DELETE로 데이터를 지워도 AUTO_INCREMENT 값은 보통 “계속 증가”합니다. 이건 정상 동작입니다.

1) 다음 번호를 수동으로 조정하기

ALTER TABLE members AUTO_INCREMENT = 1;
  • 테이블이 비어있다면 다음 INSERT부터 1부터 다시 시작하도록 맞출 수 있습니다.
  • 테이블에 데이터가 남아있다면, 실제로는 “현재 최대 PK + 1”로 자동 조정될 수 있습니다.

2) 데이터를 전부 비우고(초기화) 다시 시작하고 싶다면

TRUNCATE TABLE members;

TRUNCATE는 테이블 구조는 유지하고 데이터만 빠르게 비우는 명령이며, 일반적으로 AUTO_INCREMENT도 시작값으로 리셋되는 동작을 합니다.

실무 디테일 3: COMMENT로 테이블/컬럼 설명 달기

실무에서는 “이 컬럼이 뭘 의미하지?”가 가장 큰 비용입니다. MySQL은 컬럼/테이블에 COMMENT를 달아 문서화를 할 수 있습니다.

COMMENT 확인 방법

SHOW CREATE TABLE members\G;
SHOW FULL COLUMNS FROM members;

💡 에디터의 팁
테이블 설계에서 “주석(설명)”은 귀찮아 보여도, 나중에 팀원이 늘어나면 생산성을 크게 올립니다.

생성 확인 및 초보자가 자주 하는 실수

테이블 구조 확인 (MySQL)

DESC members;
SHOW CREATE TABLE members\G;

초보자가 자주 겪는 에러

  1. 마지막 줄 콤마(,): 마지막 컬럼 뒤에는 콤마를 찍지 않습니다.
  2. 이미 존재하는 테이블: Table 'members' already existsIF NOT EXISTS 사용 권장
  3. 예약어 사용: order, select 같은 이름은 피하거나, 꼭 써야 하면 백틱(`)으로 감싸야 합니다.

결론: 이제 데이터를 담을 준비가 끝났습니다

오늘 우리는 MySQL 첫 테이블 생성이라는 중요한 관문을 통과했습니다.

  1. 테이블 구조 이해: 엑셀과 비교해 스키마 개념을 잡고
  2. CREATE TABLE 문법: 테이블 뼈대를 세우고
  3. 타입/제약조건: 무결성 있는 설계를 하고
  4. 실무 디테일: InnoDB, AUTO_INCREMENT, COMMENT까지 챙겼습니다

다음 단계는 이 그릇에 실제 데이터를 담는 INSERT와, 안전하게 수정/삭제하는 UPDATE/DELETE + WHERE입니다.

자주 묻는 질문 (FAQ)

Q: Primary Key(기본키)는 꼭 만들어야 하나요?

A: 네, 강력히 권장합니다. 기본키가 없으면 특정 데이터를 정확하게 찾거나 수정하기 어렵고, 중복 데이터가 쌓이기 쉽습니다.

Q: AUTO_INCREMENT가 계속 증가하는데 버그인가요?

A: 정상입니다. 번호는 “되돌리지 않는 것”이 기본 동작입니다. 비워진 테이블에서 다시 1부터 시작하고 싶다면 TRUNCATE 또는 ALTER TABLE ... AUTO_INCREMENT를 사용하세요.

Q: InnoDB는 꼭 명시해야 하나요?

A: 대부분의 MySQL 환경에서 기본 엔진이 InnoDB라 생략해도 되지만, 서버 설정이 다를 수 있어 재현 가능한 SQL을 만들려면 명시하는 습관이 좋습니다.

이 글은 어떠셨나요? 자유롭게 의견을 남겨주세요! 💬