CREATE TABLE로 테이블 구조를 설계하고, 자료형·기본키·NOT NULL을 지정해 데이터 무결성의 토대를 만듭니다.
🎯 학습 목표
이 강을 마치면 CREATE TABLE로 새 테이블을 직접 만들 수 있습니다. INTEGER, TEXT, REAL 등 SQLite의 자료형을 올바르게 선택하고, PRIMARY KEY와 NOT NULL 제약으로 데이터 무결성의 기초를 갖춘 테이블을 설계할 수 있게 됩니다. 또한 ALTER TABLE과 DROP TABLE로 기존 테이블을 변경·삭제하는 방법도 익힙니다.
💡 DDL — 데이터 정의 언어
이 섹션에서는 테이블 구조를 만들고 변경하는 DDL의 개념을 살펴보겠습니다.
19강에서 배운 INSERT, UPDATE, DELETE는 데이터(행)를 조작하는 DML이었습니다. DDL(Data Definition Language)은 테이블, 인덱스, 뷰처럼 데이터베이스 구조를 정의하는 명령입니다. 대표적인 DDL 명령은 다음과 같습니다.
| 명령 | 역할 |
|---|---|
| CREATE TABLE | 새 테이블 생성 |
| ALTER TABLE | 기존 테이블 구조 변경 (열 추가·수정·삭제) |
| DROP TABLE | 테이블 삭제 (구조 + 데이터 모두 제거) |
| CREATE INDEX | 인덱스 생성 (22강) |
DML과 달리 DDL은 대부분의 DBMS에서 자동으로 COMMIT됩니다. 즉, 실행 즉시 확정되어 ROLLBACK이 불가능합니다. 특히 DROP TABLE은 테이블과 모든 데이터를 영구적으로 삭제하므로 극도의 주의가 필요합니다.
🏗️ CREATE TABLE — 테이블 만들기
이 섹션에서는 CREATE TABLE 문법과 올바른 테이블 설계 방법을 살펴보겠습니다.
CREATE TABLE의 기본 문법입니다.
CREATE TABLE 테이블명 (
열이름1 자료형 [제약조건],
열이름2 자료형 [제약조건],
...
[테이블 수준 제약조건]
);
실습 DB의 members 테이블을 직접 만들어 봅니다.
CREATE TABLE members_copy (
member_id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
grade TEXT,
join_date TEXT NOT NULL
);
각 열의 구성 요소를 분석합니다. member_id INTEGER PRIMARY KEY는 member_id라는 이름의 INTEGER 자료형 열이고, PRIMARY KEY(기본키)로 지정됩니다. 기본키는 중복될 수 없고 NULL이 될 수 없습니다. name TEXT NOT NULL은 TEXT 자료형이고 NULL을 허용하지 않습니다. 즉, 반드시 값이 있어야 합니다. email TEXT NOT NULL UNIQUE는 NULL 불허이고 UNIQUE(유일값)이어야 합니다. 같은 이메일을 가진 두 회원이 생길 수 없습니다. grade TEXT는 제약 없음이므로 NULL 허용입니다.
📦 SQLite 자료형
이 섹션에서는 SQLite에서 사용하는 자료형 체계를 살펴보겠습니다.
SQLite는 다른 DBMS와 다른 독특한 자료형 시스템을 사용합니다. SQLite의 기본 자료형 5가지입니다.
| 자료형 | 설명 | 예시 값 |
|---|---|---|
| INTEGER | 정수 (1~8바이트) | 1, -5, 100 |
| REAL | 부동소수점 실수 | 3.14, -0.5 |
| TEXT | 문자열 (UTF-8) | '김민준', '2024-01-01' |
| BLOB | 이진 데이터 그대로 저장 | 이미지, 파일 바이너리 |
| NULL | 값 없음을 나타내는 특수 값 | NULL |
SQLite는 동적 자료형(Type Affinity) 시스템을 사용합니다. 열에 선언한 자료형은 힌트(Affinity)일 뿐, 실제로는 어떤 자료형도 넣을 수 있습니다. 예를 들어 INTEGER 열에 '안녕'이라는 TEXT를 넣어도 오류가 나지 않습니다. 이것은 SQLite의 특징으로 MySQL, PostgreSQL과 다릅니다. 엄격한 자료형 검증이 필요하다면 CHECK 제약(21강)을 추가합니다.
날짜와 시간은 SQLite에 전용 자료형이 없습니다. TEXT('YYYY-MM-DD'), INTEGER(Unix 타임스탬프), REAL(율리우스 일수) 중 하나를 선택합니다. 실습에서는 'YYYY-MM-DD' 형식의 TEXT를 사용했습니다. 가장 읽기 쉽고 대소 비교로 날짜 순서를 정확하게 표현할 수 있기 때문입니다.
-- 주문 테이블 직접 설계
CREATE TABLE orders_v2 (
order_id INTEGER PRIMARY KEY AUTOINCREMENT,
member_id INTEGER NOT NULL,
book_id INTEGER NOT NULL,
quantity INTEGER NOT NULL DEFAULT 1,
order_date TEXT NOT NULL DEFAULT (date('now')),
status TEXT NOT NULL DEFAULT 'PENDING'
);
AUTOINCREMENT는 INTEGER PRIMARY KEY에 붙여 새 행 삽입 시 자동으로 증가하는 숫자를 할당합니다. 직접 값을 지정하지 않아도 됩니다. DEFAULT 1은 quantity 값을 생략하면 1이 자동으로 입력됩니다. DEFAULT (date('now'))는 오늘 날짜가 자동으로 입력됩니다.
🔧 ALTER TABLE — 구조 변경
이 섹션에서는 기존 테이블에 열을 추가하거나 테이블 이름을 바꾸는 ALTER TABLE을 살펴보겠습니다.
운영 중인 테이블에 새 열이 필요하거나 이름을 변경해야 할 때 ALTER TABLE을 씁니다.
-- 열 추가 (새 열은 항상 마지막에 추가됨)
ALTER TABLE members_copy ADD COLUMN phone TEXT;
ALTER TABLE members_copy ADD COLUMN created_at TEXT DEFAULT (datetime('now'));
-- 테이블 이름 변경
ALTER TABLE members_copy RENAME TO members_backup;
-- 열 이름 변경 (SQLite 3.25.0 이상)
ALTER TABLE members_backup RENAME COLUMN phone TO phone_number;
SQLite의 ALTER TABLE은 다른 DBMS에 비해 제한적입니다. 열의 자료형 변경이나 열 삭제는 직접 지원하지 않습니다(SQLite 3.35.0 이상에서는 DROP COLUMN 지원). 이 경우 새 테이블을 만들고 데이터를 복사한 후 기존 테이블을 삭제하는 방법을 씁니다. MySQL, PostgreSQL은 훨씬 많은 ALTER TABLE 기능을 지원합니다.
🗑️ DROP TABLE — 테이블 삭제
이 섹션에서는 테이블을 완전히 삭제하는 DROP TABLE을 살펴보겠습니다.
-- 테이블 삭제 (구조 + 모든 데이터 영구 삭제!)
DROP TABLE members_backup;
-- 테이블이 없어도 오류가 나지 않게 (안전한 패턴)
DROP TABLE IF EXISTS members_backup;
DROP TABLE은 되돌릴 수 없습니다. 실수로 중요한 테이블을 삭제하는 사고를 방지하기 위해, 프로덕션 DB에서는 DROP TABLE 전 반드시 백업을 확인합니다. IF EXISTS는 테이블이 이미 없을 때 발생하는 오류를 방지합니다. 실습 환경에서 스크립트를 반복 실행할 때 유용합니다.
📝 핵심 요약
이번 강에서 배운 내용을 정리하겠습니다.
| 명령 | 문법 예시 | 주의사항 |
|---|---|---|
| CREATE TABLE | CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT NOT NULL) | 자료형·제약 조건 신중히 설계 |
| ALTER TABLE ADD | ALTER TABLE t ADD COLUMN col TEXT | 새 열은 항상 마지막에 추가 |
| ALTER TABLE RENAME | ALTER TABLE t RENAME TO new_name | 참조하는 뷰·트리거에 영향 |
| DROP TABLE | DROP TABLE IF EXISTS t | 되돌릴 수 없음 — 백업 필수 |
테이블 설계는 데이터베이스의 품질을 결정하는 핵심 작업입니다. 다음 21강에서는 PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL, CHECK처럼 데이터 무결성을 보장하는 제약 조건을 더 깊이 배웁니다. 잘못된 데이터가 처음부터 저장되지 않도록 데이터베이스 수준에서 방어하는 방법을 익힙니다.
관련 주제
- CREATE TABLE
- ALTER TABLE
- DROP TABLE
- 자료형 INTEGER TEXT REAL
- PRIMARY KEY
- NOT NULL
- DDL
- 개발·프로그래밍
- 개발·프로그래밍 강의
- SQL·데이터베이스 입문 24강
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
SQL·데이터베이스 입문 24강
이 강의가 속한 시리즈는 총 24강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
