DDL
DDL의 개념
Data Definition Language 데이터 정의 언어
데이터베이스의 구조(객체)를 생성, 변경, 삭제하는 명령어
DDL 명령문의 종류
명령어
설명
CREATE
객체를 생성하는 명령어
ALTER
객체를 변경하는 명령어(추가, 수정, 삭제 등)
DROP
객체 자체를 삭제하는 명령어
TRUNCATE
객체와 그 구조는 유지하되, 데이터만 삭제하는 명령어
RENAME
객체의 명칭(이름)을 수정하는 명령어
DDL의 대상
대상(영문)
대상(한글)
설명
DATABASE
데이터베이스
최상위 저장 단위인 DB 자체
SCHEMA
스키마
객체(테이블 등)을 그룹화하는 네임스페이스
TABLE
테이블
데이터를 행(row)과 열(column)로 저장하는 기본 객체
INDEX
인덱스
검색 성능 향상을 위한 자료구조
VIEW
뷰
SELECT 결과를 저장한 가상 테이블 (실제 데이터 저장은 아님)
SEQUENCE
시퀀스
자동 증가 숫자를 생성하는 객체
ROLE
역할(권한 그룹)
권한을 묶어서 관리하는 객체 (사용자 개념을 포함)
USER
사용자
로그인 가능한 계정 (ROLE 중 로그인 가능한 ROLE)
컬럼(COLUMN)과 제약조건(CONSTRAINT)은 테이블의 구성요소로 DDL에서 사용된다.
DDL의 특징
데이터가 아닌, 데이터베이스의 구조를 다루는 명령문
Auto Commit : 기본적으로는 명령어 실행시 즉시 데이터베이스에 반영된다.
Rollback 불가 : 기본적으로는 실행한 명령을 되돌릴 수 없다.
Rollback 이 가능케 하려면 BEGIN + COMMIT 키워드를 사용해서 트랜잭션을 만들어줘야 한다.
이는 본 포스팅의 10. 실무 참고에서 추가로 다룬다.
1. Database
(1) 생성
1
2
3
4
5
6
7
8
9
10
11
12
CREATE DATABASE 데이터베이스 _ 이름
[ WITH
[ OWNER [ = ] user_name ]
[ TEMPLATE [ = ] template ]
[ ENCODING [ = ] encoding ] # e . g . 'UTF8'
[ LC_COLLATE [ = ] lc_collate ] # e . g . 'ko_KR.UTF-8'
[ LC_CTYPE [ = ] lc_ctype ] # e . g . 'ko_KR.UTF-8'
[ TABLESPACE [ = ] tablespace ]
[ ALLOW_CONNECTIONS [ = ] boolean ]
[ CONNECTION LIMIT [ = ] integer ] # e . g . - 1
[ IS_TEMPLATE [ = ] boolean ]
] ;
(2) 삭제
※ 접속 중인 세션이 있으면 삭제 불가
(3) 주석
1
COMMENT ON DATABASE mydb IS '내 DB' ;
2. Schema
(1) 생성
1
CREATE SCHEMA myschema ;
(2) 삭제
(3) CASCADE 삭제 (하위 객체 포함)
1
DROP SCHEMA myschema CASCADE ;
(4) 주석
1
COMMENT ON SCHEMA myschema IS '나의 스키마' ;
3. Table
(1) 생성
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE users (
id SERIAL PRIMARY KEY ,
name VARCHAR ( 100 ) NOT NULL ,
email TEXT UNIQUE ,
created_at TIMESTAMP DEFAULT NOW ()
);
COMMENT ON TABLE users IS '사용자 기본 정보' ;
COMMENT ON COLUMN users . id IS '사용자 ID (PK)' ;
COMMENT ON COLUMN users . name IS '사용자 이름' ;
COMMENT ON COLUMN users . email IS '이메일 주소' ;
(2) 수정
1
ALTER TABLE users ADD COLUMN age INT ;
1
ALTER TABLE users ALTER COLUMN age TYPE BIGINT ;
1
ALTER TABLE users DROP COLUMN age ;
1
ALTER TABLE users RENAME COLUMN name TO username ;
1
ALTER TABLE users RENAME TO app_users ;
(3) 삭제
1
DROP TABLE IF EXISTS users ;
1
2
COMMENT ON TABLE 테이블이름 IS NULL ;
COMMENT ON COLUMN 테이블이름 . 컬럼명 1 IS NULL ;
4. CONSTRAINT 제약조건
(1) Primary Key
1
2
3
CREATE TABLE orders (
id SERIAL PRIMARY KEY
);
(2) Foreign Key
1
2
3
4
5
6
7
CREATE TABLE orders (
id SERIAL PRIMARY KEY ,
user_id INT ,
CONSTRAINT fk_user
FOREIGN KEY ( user_id )
REFERENCES users ( id )
);
(3) Unique
1
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE ( email );
(4) Check
1
ALTER TABLE users ADD CONSTRAINT age_check CHECK ( age >= 0 );
5. Index
(1) 생성
1
CREATE INDEX idx_users_email ON users ( email );
1
CREATE UNIQUE INDEX idx_users_email_unique ON users ( email );
(2) 삭제
1
DROP INDEX idx_users_email ;
6. View
(1) 생성
1
2
CREATE VIEW user_email AS
SELECT id , email FROM users ;
(2) 수정
1
2
CREATE OR REPLACE VIEW user_emails AS
SELECT id , email FROM users WHERE email IS NOT NULL ;
(3) 삭제
7. Sequence
1
2
3
4
5
CREATE SEQUENCE my_seq ;
SELECT nextval ( 'my_seq' );
DROP SEQUENCE my_seq ;
8. Truncate vs Drop
(1) Truncate : 데이터만 삭제
(2) DROP : 데이터와 객체 삭제
9. CASCADE vs RESTRICT
1
2
DROP TABLE users CASCADE ; -- 의존 객체도 같이 삭제
DROP TABLE users RESTRICT ; -- 의존 객체가 존재할 경우 삭제 실패
10. 실무 참고
1
CREATE TABLE IF NOT EXISTS users ...;
1
DROP TABLE IF EXISTS users ;
1
2
3
4
BEGIN ;
CREATE TABLE test ( id INT );
ROLLBACK ; -- 문제 있으면 롤백
COMMIT ; -- 문제 없으면 커밋
Tags:
alter ,
create ,
data ,
database ,
ddl ,
definition ,
drop ,
index ,
language ,
postgre ,
postgres ,
postgresql ,
role ,
schema ,
sql ,
table ,
truncate ,
update ,
view ,
데이터베이스 ,
뷰 ,
삭제 ,
생성 ,
수정 ,
에스큐엘 ,
인덱스 ,
테이블 ,
포스트그레
Categories:
SQL
Updated: 2026-02-d
Comments