공공부하자개발 · 영어 학습 노트
SQL
SQL 중급서브쿼리·조인·함수·DDL·인덱스0/11 완료
  • 01서브쿼리: 스칼라·인라인 뷰·상관 서브쿼리, DB별 차이
  • 02EXISTS·IN·NOT IN 과 NULL 함정
  • 03조인 심화: INNER·OUTER·SELF·CROSS, Oracle (+)
  • 04집합 연산: UNION·UNION ALL·INTERSECT·MINUS/EXCEPT
  • 05조건 로직: CASE·DECODE·IIF
  • 06NULL 처리 함수
  • 07문자·날짜 함수 DB별 비교
  • 08DDL 과 제약 조건
  • 09인덱스 기초
  • 10집계와 GROUP BY·HAVING
  • 11뷰·시퀀스·자동 증가
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › SQL 중급 › 08 / 11

DDL 과 제약 조건

CREATE·ALTER·PK·FK·UNIQUE·CHECK·DEFAULT
섹션 6진행 0 / 11
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6정리‹ 이전다음 ›

3. 코드 예제

소스: sql-src/mid_08_ddl_constraints/01_create_alter.sql. dept·emp 테이블을 새로 만들며 CREATE·ALTER 의 기본 동작을 확인합니다.

예제 1: CREATE TABLE — 부서 · 사원 테이블 생성

sql
CREATE TABLE dept (
    code  VARCHAR(10)
  , dname VARCHAR(20)
  , loc   VARCHAR(20)
  , CONSTRAINT pk_dept PRIMARY KEY (code)
);
CREATE TABLE emp (
    id     INT
  , name   VARCHAR(20)
  , dept   VARCHAR(10)
  , sal    INT
  , hired  DATE
  , CONSTRAINT pk_emp PRIMARY KEY (id)
);
INSERT INTO dept VALUES
  ('개발', '개발팀', '서울'),
  ('영업', '영업팀', '부산');
INSERT INTO emp VALUES
  (1, '김철수', '개발', 500, DATE '2022-03-01'),
  (2, '이영희', '영업', 450, DATE '2023-01-10');
SELECT id, name, dept, sal FROM emp ORDER BY id;
text
ID | NAME   | DEPT | SAL
---+--------+------+----
1  | 김철수 | 개발 | 500
2  | 이영희 | 영업 | 450
(2행)

테이블 정의 안에 CONSTRAINT pk_dept PRIMARY KEY (code) 처럼 이름 붙은 PK 를 함께 선언했습니다. 컬럼마다 줄을 나눈 CREATE TABLE 형태는 컬럼이 늘어나도 한눈에 훑어보기 쉽습니다.

예제 2: 자료형 선택 — 길이를 넘으면 오류

sql
CREATE TABLE t_short (id INT PRIMARY KEY, name VARCHAR(5));
-- @error
INSERT INTO t_short VALUES (1, '가나다라마바사');
text
예상 오류: Value too long for column "NAME CHARACTER VARYING(5)": "U&'\\ac00\\b098\\b2e4\\b77c\\b9c8\\bc14\\c0ac' (7)"

name 을 VARCHAR(5)로 좁게 잡았더니 7자짜리 문자열이 INSERT 시점에 바로 거부됩니다. 오류 메시지의 (7) 은 실제로 들어오려던 값의 길이입니다. 자료형의 길이 제한은 이렇게 잘못된 값을 DB 단계에서 걸러 줍니다.

예제 3: ALTER TABLE ADD COLUMN — 컬럼 추가와 DEFAULT 채움

sql
ALTER TABLE emp ADD COLUMN grade VARCHAR(10) DEFAULT '미정';
SELECT id, name, grade FROM emp ORDER BY id;
text
ID | NAME   | GRADE
---+--------+------
1  | 김철수 | 미정
2  | 이영희 | 미정
(2행)

이미 데이터가 있는 emp 에 grade 컬럼을 새로 추가하면서 DEFAULT '미정' 을 줬습니다. 새 컬럼을 추가하는 시점에 이미 있던 두 행에도 기본값 미정이 즉시 채워진 것을 확인할 수 있습니다.

예제 4: ALTER TABLE 로 컬럼 폭 넓히기

sql
ALTER TABLE dept ALTER COLUMN dname VARCHAR(40);
INSERT INTO dept VALUES ('인사', '인사관리지원팀(확장된 이름)', '서울');
SELECT code, dname FROM dept ORDER BY code;
text
CODE | DNAME
-----+----------------------------
개발 | 개발팀
영업 | 영업팀
인사 | 인사관리지원팀(확장된 이름)
(3행)

dname 은 원래 VARCHAR(20) 이라 20자를 넘는 부서명이 못 들어갔습니다. 폭을 VARCHAR(40) 으로 넓힌 뒤에는 긴 부서명도 정상적으로 들어갑니다. 기존 두 행의 값(개발팀·영업팀)은 폭을 넓혀도 그대로 남아 있습니다.

예제 5: 컬럼 이름 바꾸기

sql
ALTER TABLE emp RENAME COLUMN grade TO rank_label;
SELECT id, name, rank_label FROM emp ORDER BY id;
text
ID | NAME   | RANK_LABEL
---+--------+-----------
1  | 김철수 | 미정
2  | 이영희 | 미정
(2행)

grade 컬럼을 rank_label 로 이름만 바꿨습니다. 값은 그대로 유지되고, 이후 쿼리부터는 새 이름으로 접근해야 합니다. DB 마다 이름 변경 문법이 다르다는 점은 4절 응용 예제에서 다시 비교합니다.

예제 6: DROP TABLE 과 TRUNCATE TABLE — 구조는 남기고 데이터만 비우기

sql
CREATE TABLE t_log (id INT PRIMARY KEY, msg VARCHAR(20));
INSERT INTO t_log VALUES (1, '시작'), (2, '진행'), (3, '완료');
SELECT COUNT(*) AS cnt FROM t_log;
TRUNCATE TABLE t_log;
SELECT COUNT(*) AS cnt FROM t_log;
text
CNT
---
0
(1행)

TRUNCATE 전에는 3건이던 t_log 가 TRUNCATE 뒤 0건으로 줄었지만, 테이블 자체는 그대로 남아 바로 INSERT 할 수 있습니다. 이어서 DROP TABLE t_log 로 테이블을 아예 지우면, 그 뒤의 SELECT * FROM t_log 는 "테이블을 찾을 수 없음" 오류로 테이블 자체가 없어졌음을 보여줍니다.

예제 직접 실행

아래 폴더의 SQL 파일을 Git Bash 에서 H2 메모리 DB 로 실행합니다. 방언은 파일 안의 SET MODE 로 바꿉니다.

cd sql-src/mid_08_ddl_constraints
ls *.sql
bash ../run.sh <파일>.sql
코드 예제
  • 예제 1: CREATE TABLE — 부서 · 사원 테이블 생성
  • 예제 2: 자료형 선택 — 길이를 넘으면 오류
  • 예제 3: ALTER TABLE ADD COLUMN — 컬럼 추가와 DEFAULT 채움
  • 예제 4: ALTER TABLE 로 컬럼 폭 넓히기
  • 예제 5: 컬럼 이름 바꾸기
  • 예제 6: DROP TABLE 과 TRUNCATE TABLE — 구조는 남기고 데이터만 비우기
이전 섹션2 핵심 원리3 / 6다음 섹션4 응용 변형 예제