본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

MySQL CREATE TABLE — usertbl 회원 테이블 완전 정리

by 왕진 2026. 7. 13.
반응형

 

 

Web Development · MySQL

MySQL CREATE TABLE —
usertbl 회원 테이블 완전 정리

컬럼 이름·데이터 타입·제약 조건을 한 줄씩 읽으며 테이블 설계 원리 이해하기
시작 오늘 분석할 코드

회원 정보를 저장하는 usertbl을 만드는 CREATE TABLE 구문이다. 각 컬럼의 데이터 타입과 제약 조건을 보면 왜 이 타입을 선택했는지가 보인다.

CREATE TABLE usertbl ( userID CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK) name VARCHAR(10) NOT NULL, -- 이름 birthYear INT NOT NULL, -- 출생년도 addr CHAR(2) NOT NULL, -- 지역(2글자) mobile1 CHAR(3), -- 국번(011, 010 등) mobile2 CHAR(8), -- 나머지 번호 height SMALLINT, -- 키 mDate DATE -- 회원 가입일 );
용어 용어 정리
CREATE TABLE새 테이블을 정의하는 DDL 명령어
PRIMARY KEY행을 유일하게 식별하는 기본키. 중복·NULL 불가
NOT NULLNULL(빈 값) 입력을 허용하지 않는 제약
CHAR(n)고정 길이 문자열. n글자 미만이면 공백 채움
VARCHAR(n)가변 길이 문자열. 입력 길이만큼만 저장
INT4바이트 정수 (약 -21억 ~ 21억)
SMALLINT2바이트 정수 (-32,768 ~ 32,767)
DATE날짜 저장 타입 (YYYY-MM-DD 형식)

1 CHAR vs VARCHAR — 고정 vs 가변

userID는 CHAR(8), name은 VARCHAR(10)을 쓴 이유가 있다. CHAR는 입력값이 8글자 미만이어도 항상 8글자 공간을 차지한다. VARCHAR는 실제 입력 길이만큼만 저장한다.

타입 'KBS' 저장 시 언제 쓰나
CHAR(8) 'KBS ' (8byte, 공백 채움) 길이가 일정한 코드값 (ID, 국번 등)
VARCHAR(10) 'KBS' (3byte만) 길이가 들쭉날쭉한 이름, 설명 등
※ userID를 CHAR(8)로 고정한 이유 — 'LSG', 'KBS' 같은 ID는 모두 3글자이고 형식이 정해져 있어서, 공간이 약간 낭비되더라도 CHAR가 검색 성능에서 유리하다.

2 NOT NULL vs NULL 허용 — 필수 vs 선택

userID, name, birthYear, addr에는 NOT NULL이 붙어 있고, mobile1, mobile2, height, mDate는 그냥 두었다. 이 차이는 "반드시 있어야 하는 정보"와 "없어도 되는 정보"의 구분이다.

mobile1 CHAR(3), -- NULL 허용: 휴대폰 없는 회원도 있을 수 있음 name VARCHAR(10) NOT NULL -- 이름은 반드시 있어야 함
※ INSERT 시 NOT NULL 컬럼을 빠뜨리면 오류가 난다. NULL을 허용하는 컬럼은 값을 생략하면 자동으로 NULL이 저장된다.

3 PRIMARY KEY — 기본키의 역할

userID CHAR(8) NOT NULL PRIMARY KEY에서 PRIMARY KEY는 테이블에서 각 행을 유일하게 식별하는 컬럼임을 선언한다. 기본키는 두 가지를 자동으로 보장한다.

기본키 특성 의미
유일성 (UNIQUE) 같은 userID가 두 번 들어갈 수 없음
NOT NULL 기본키는 반드시 값이 있어야 함
※ 기본키는 다른 테이블(buytbl)에서 외래키(FOREIGN KEY)로 참조된다. 즉, 이 usertbl의 userID가 buytbl의 연결 고리가 된다.

 

반응형

 

4 MySQL 정수 타입 선택 기준
INT / SMALLINT / TINYINT / BIGINT 비교

usertbl에서 birthYear는 INT, height는 SMALLINT를 쓴다. 저장할 숫자의 범위에 맞게 타입을 고르면 저장 공간을 절약할 수 있다.

타입 크기 범위 적합한 용도
TINYINT 1 byte -128 ~ 127 상태코드, 나이(0~127)
SMALLINT 2 byte -32,768 ~ 32,767 키(cm), 포인트, 소규모 수
INT 4 byte -2,147,483,648 ~ 2,147,483,647 나이·년도·일반 수치
BIGINT 8 byte 약 -9.2 × 10¹⁸ ~ +9.2 × 10¹⁸ 전화번호·누적 조회수
UNSIGNED를 붙이면 음수 범위를 양수로 돌려 최대값이 두 배가 된다. 예: TINYINT UNSIGNED = 0~255, SMALLINT UNSIGNED = 0~65,535.

5 안전한 테이블 생성 패턴
DROP TABLE IF EXISTS → CREATE TABLE — 재실행해도 오류 없는 패턴

테이블이 이미 존재하는 상태에서 CREATE TABLE을 실행하면 오류가 난다. 스크립트를 여러 번 실행해도 안전하게 만들려면 먼저 DROP TABLE IF EXISTS로 지우고 다시 만들면 된다.

DROP TABLE IF EXISTS usertbl; -- 없으면 무시, 있으면 삭제 CREATE TABLE usertbl ( userID CHAR(8) NOT NULL PRIMARY KEY, name VARCHAR(10) NOT NULL, birthYear INT NOT NULL, addr CHAR(2) NOT NULL, mobile1 CHAR(3), mobile2 CHAR(8), height SMALLINT, mDate DATE );
DROP TABLE은 데이터까지 전부 삭제한다. 실제 운영 DB에서는 절대 무분별하게 사용하면 안 된다. 학습·개발 환경에서만 이 패턴을 쓸 것.

6 테이블 구조 확인 명령어
DESC와 SHOW CREATE TABLE — 만들어진 테이블을 검증하는 방법

CREATE TABLE을 실행한 후, 의도한 대로 만들어졌는지 확인할 수 있는 명령어 두 가지가 있다.

DESC usertbl; -- 컬럼명·타입·Null·Key·Default 요약 표 SHOW CREATE TABLE usertbl; -- 실제 생성에 사용된 SQL 전체 출력
명령어 출력 내용 언제 쓰나
DESC 테이블명 컬럼명, 타입, NULL 허용, PK 여부, 기본값, Extra 컬럼 구성 빠르게 확인
SHOW CREATE TABLE 테이블명 CREATE TABLE SQL 원문 + COLLATE + ENGINE 포함 테이블 생성 스크립트 백업·재현
SHOW TABLES 현재 DB의 테이블 목록 어떤 테이블이 있는지 목록 확인

7 컬럼 DEFAULT 값 설정
INSERT 시 값을 생략하면 자동으로 채워지는 기본값

컬럼 정의에 DEFAULT를 지정하면 INSERT 시 해당 컬럼을 생략했을 때 자동으로 그 값이 들어간다. usertbl에는 없지만, 실무에서 자주 사용하는 패턴이다.

CREATE TABLE example ( id INT AUTO_INCREMENT PRIMARY KEY, status TINYINT DEFAULT 1, -- 생략 시 1 (활성) score INT DEFAULT 0, -- 생략 시 0점 joinDate DATETIME DEFAULT CURRENT_TIMESTAMP -- 생략 시 현재 시각 );
DEFAULT CURRENT_TIMESTAMP는 레코드 삽입 시각을 자동으로 기록하는 데 유용하다. 회원 가입 시각, 주문 생성 시각 등에 자주 쓰인다.

8 usertbl 전체 흐름 정리
DB 생성부터 테이블 확인까지 한 번에
-- 전체 세팅 흐름 DROP DATABASE IF EXISTS sqldb; CREATE DATABASE sqldb; USE sqldb; CREATE TABLE usertbl ( userID CHAR(8) NOT NULL PRIMARY KEY, name VARCHAR(10) NOT NULL, birthYear INT NOT NULL, addr CHAR(2) NOT NULL, mobile1 CHAR(3), mobile2 CHAR(8), height SMALLINT, mDate DATE ); DESC usertbl; -- 구조 확인 SELECT * FROM usertbl; -- 데이터 확인

9 UNIQUE 제약 — 중복 불가 but NULL 가능

PRIMARY KEY는 중복·NULL 모두 불가이지만, UNIQUE중복은 불가, NULL은 가능하다. 이메일처럼 "반드시 고유해야 하지만 없을 수도 있는" 컬럼에 사용한다.

CREATE TABLE member ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(100) UNIQUE -- 중복 이메일 불가, 이메일 없는 회원은 NULL 허용 );
usertbl의 userID는 PRIMARY KEY(중복·NULL 불가), mobile2는 NULL 허용(UNIQUE 없음). 이메일·닉네임 등 고유성이 필요한 비필수 컬럼에 UNIQUE를 추가하는 것이 실무 패턴이다.

10 DESC 출력 읽는 법
DESC usertbl 실제 출력 해석

DESC usertbl을 실행하면 아래와 같은 형태의 표가 출력된다. 각 컬럼의 의미를 알면 테이블 구조를 한눈에 파악할 수 있다.

Field Type Null Key Default Extra
userID char(8) NO PRI NULL  
name varchar(10) NO   NULL  
birthYear int NO   NULL  
height smallint YES   NULL  
mDate date YES   NULL  

Null = NO이면 NOT NULL 제약이 걸린 것. Key = PRI이면 기본키. Extra에는 auto_increment가 표시된다.


10 자주 하는 실수
실수 증상 해결
CHAR vs VARCHAR 혼동 공간 낭비 또는 데이터 잘림 고정 길이 코드→CHAR, 가변 텍스트→VARCHAR
기본키 컬럼에 중복 INSERT Duplicate entry 오류 기본키는 유일한 값만 허용
NOT NULL 컬럼 값 생략 INSERT 오류 NOT NULL 컬럼은 반드시 값 제공
DATE 형식 틀리게 입력 오류 또는 0000-00-00 저장 DATE는 'YYYY-MM-DD' 형식 준수

핵심 한 줄 요약

CREATE TABLE컬럼명 타입 제약조건을 한 줄씩 나열해 테이블 정의
PRIMARY KEY행을 유일하게 식별 — 중복·NULL 불가
NOT NULL빈 값 금지 — 필수 입력 컬럼
CHAR vs VARCHAR고정 길이 코드→CHAR / 가변 텍스트→VARCHAR
DATE날짜 저장 (YYYY-MM-DD)
TINYINT / SMALLINT / INT저장 범위에 맞는 최소 타입 선택 — 공간 절약
DROP TABLE IF EXISTS이미 있어도 오류 없이 삭제 후 재생성 — 개발 환경 필수 패턴
DESC 테이블명컬럼 구조 빠른 확인 / SHOW CREATE TABLE로 완전한 SQL 확인
DEFAULT컬럼 생략 시 자동으로 채울 기본값 — CURRENT_TIMESTAMP로 시각 자동 기록
UNIQUE중복 불가 + NULL 허용 — PK처럼 고유하지만 선택 항목인 컬럼에 사용
DESC 출력Field/Type/Null/Key/Default/Extra — Key=PRI면 기본키, Null=NO면 NOT NULL
PK userID=CHAR(8)형식 고정된 코드 → CHAR, 변경 빈도 낮고 검색 성능 유리
SHOW TABLES현재 DB 테이블 목록 확인 — DROP 전 존재 여부 체크
height SMALLINT NULL허용키 정보 없는 회원도 있을 수 있음 — NOT NULL 안 붙이면 NULL 가능
CREATE DATABASEDB 생성 → USE → 테이블 생성 순서 지켜야 함
테이블 수정만들어진 테이블 컬럼 추가·수정·삭제는 ALTER TABLE 사용
테이블 설계 원칙컬럼 타입 = 저장할 값의 최소 범위 + 미래 확장 여유 고려

Tags

#MySQL #CREATE TABLE #PRIMARY KEY #NOT NULL #VARCHAR #CHAR #SMALLINT #DATE #테이블생성 #컬럼정의 #데이터타입 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, CREATE TABLE, PRIMARY KEY, NOT NULL, VARCHAR, CHAR, SMALLINT, DATE, 테이블생성, 컬럼정의, 데이터타입, 웹개발, 티스토리
반응형

댓글