DDL·제약조건 완벽 정리
SQLD 시험 출제 범위의 DDL 명령어와 제약조건을 구문 예시와 함께 정리
1. DDL 개요
DDL이란?
DDL(Data Definition Language)은 데이터베이스 구조를 정의·변경·삭제하는 SQL 명령어입니다. 테이블, 인덱스, 뷰 등 데이터베이스 객체의 생성과 변경을 담당합니다. DDL은 실행 즉시 AUTO COMMIT되므로 ROLLBACK이 불가능합니다.
DDL 명령어 종류
| 명령어 | 설명 | 대상 |
|---|---|---|
| CREATE | 객체 생성 | TABLE, VIEW, INDEX 등 |
| ALTER | 객체 구조 변경 | 컬럼 추가/수정/삭제 |
| DROP | 객체 완전 삭제 | 테이블 자체를 제거 |
| TRUNCATE | 데이터 전체 삭제 (구조 유지) | 테이블 데이터만 제거 |
| RENAME | 객체 이름 변경 | 테이블명 변경 |
2. CREATE TABLE
기본 구문
CREATE TABLE 테이블명 (
컬럼명1 데이터타입 [DEFAULT 기본값] [제약조건],
컬럼명2 데이터타입 [DEFAULT 기본값] [제약조건],
...
[테이블 레벨 제약조건]
);
테이블명은 문자로 시작해야 하며, A-Z, 0-9, _, $, # 만 사용 가능합니다.
CREATE TABLE 예시
CREATE TABLE EMP (
EMP_ID NUMBER PRIMARY KEY,
EMP_NAME VARCHAR2(50) NOT NULL,
DEPT_ID NUMBER REFERENCES DEPT(DEPT_ID),
SALARY NUMBER DEFAULT 0,
GRADE VARCHAR2(1) CHECK (GRADE IN ('A','B','C'))
);
CTAS (CREATE TABLE AS SELECT)
기존 테이블의 데이터를 복사하여 새 테이블을 생성합니다. NOT NULL을 제외한 제약조건은 복사되지 않습니다.
CREATE TABLE EMP_BACKUP AS
SELECT * FROM EMP;
구조만 복사하려면 WHERE 1=0 (Oracle) 또는 WHERE 1=2를 추가합니다.
3. 제약조건 (Constraints)
제약조건 종류
| 제약조건 | 설명 | NULL 허용 |
|---|---|---|
| PRIMARY KEY | 유일성 + NOT NULL (테이블당 1개) | 불가 |
| UNIQUE | 유일성 보장 (여러 개 가능) | 가능 (NULL 중복 허용) |
| FOREIGN KEY | 참조 무결성 (부모 테이블 참조) | 가능 |
| NOT NULL | NULL 값 입력 금지 | 불가 |
| CHECK | 입력 값 범위/조건 제한 | 가능 |
| DEFAULT | 기본값 설정 (제약조건은 아님) | 가능 |
컬럼 레벨 vs 테이블 레벨
| 구분 | 컬럼 레벨 | 테이블 레벨 |
|---|---|---|
| 위치 | 컬럼 정의 옆 | 컬럼 정의 아래 별도 행 |
| 복합키 | 불가 | 가능 |
| NOT NULL | 가능 | 불가 (컬럼 레벨만 가능) |
NOT NULL은 반드시 컬럼 레벨에서만 정의해야 합니다. 이것은 시험 빈출 포인트입니다.
PRIMARY KEY 특징
- 1. UNIQUE + NOT NULL — 유일성과 NOT NULL을 동시에 보장
- 2. 테이블당 1개만 가능 — 복합 PK는 가능하지만 PK 자체는 1개
- 3. 자동 인덱스 생성 — PK 생성 시 UNIQUE INDEX가 자동으로 생성됨
- 4. FK의 참조 대상 — 다른 테이블의 FK가 참조할 수 있음
FOREIGN KEY와 참조 무결성
FK는 부모 테이블의 PK 또는 UNIQUE 컬럼만 참조할 수 있습니다. 부모에 없는 값은 자식에 입력할 수 없습니다.
| 삭제 옵션 | 부모 행 삭제 시 동작 |
|---|---|
| CASCADE | 자식 행도 함께 삭제 |
| SET NULL | 자식의 FK 값을 NULL로 변경 |
| SET DEFAULT | 자식의 FK 값을 DEFAULT로 변경 |
| RESTRICT | 자식이 참조 중이면 삭제 불가 |
| NO ACTION | 참조 무결성 위반 시 에러 (기본값) |
4. ALTER TABLE
ALTER TABLE 구문 정리
| 작업 | Oracle 구문 | SQL Server 구문 |
|---|---|---|
| 컬럼 추가 | ALTER TABLE T ADD (COL 타입) | ALTER TABLE T ADD COL 타입 |
| 컬럼 수정 | ALTER TABLE T MODIFY (COL 타입) | ALTER TABLE T ALTER COLUMN COL 타입 |
| 컬럼 삭제 | ALTER TABLE T DROP COLUMN COL | ALTER TABLE T DROP COLUMN COL |
| 컬럼명 변경 | ALTER TABLE T RENAME COLUMN A TO B | sp_rename'T.A', 'B', 'COLUMN' |
| 제약조건 추가 | ALTER TABLE T ADD CONSTRAINT 이름 제약조건 | |
MODIFY 시 주의사항
- 1. 데이터 타입 변경 — 컬럼에 데이터가 없으면 자유롭게 변경 가능
- 2. 크기 축소 — 기존 데이터보다 작은 크기로 변경 불가
- 3. NOT NULL 추가 — 기존 데이터에 NULL이 있으면 추가 불가
- 4. DEFAULT 변경 — 변경 후 새로 INSERT되는 행부터 적용
5. DROP TABLE
기본 구문
DROP TABLE 테이블명 [CASCADE CONSTRAINT];
- CASCADE CONSTRAINT — 해당 테이블을 참조하는 다른 테이블의 FK 제약조건도 함께 삭제
- DROP 시 — 테이블 구조 + 데이터 + 인덱스 + 제약조건 모두 삭제
- AUTO COMMIT — DDL이므로 ROLLBACK 불가
6. TRUNCATE vs DELETE
핵심 비교 테이블
| 항목 | TRUNCATE | DELETE |
|---|---|---|
| 분류 | DDL (데이터 정의어) | DML (데이터 조작어) |
| ROLLBACK | 불가 (AUTO COMMIT) | 가능 (COMMIT 전까지) |
| WHERE 절 | 사용 불가 (전체 삭제만) | 사용 가능 (조건 삭제) |
| 로그 | 최소 로그 기록 | 행 단위 로그 기록 |
| 속도 | 빠름 | 느림 (대량 데이터) |
| 저장 공간 | 즉시 해제 | 해제되지 않음 |
| 테이블 구조 | 유지 | 유지 |
TRUNCATE는 DDL이므로 AUTO COMMIT, DELETE는 DML이므로 ROLLBACK 가능 — 시험 필수 암기!
7. RENAME
테이블명 변경
| DBMS | 구문 |
|---|---|
| Oracle | RENAME OLD_TABLE TO NEW_TABLE |
| SQL Server | sp_rename'OLD_TABLE', 'NEW_TABLE' |
8. 시험 빈출 포인트
반드시 알아야 할 포인트
- 1. DDL은 AUTO COMMIT — CREATE, ALTER, DROP, TRUNCATE, RENAME 실행 시 즉시 커밋
- 2. TRUNCATE는 DDL, DELETE는 DML — ROLLBACK 가능 여부가 다름
- 3. NOT NULL은 컬럼 레벨만 — 테이블 레벨 제약조건으로 NOT NULL을 정의할 수 없음
- 4. PK = UNIQUE + NOT NULL — 테이블당 1개만 가능, 자동 인덱스 생성
- 5. UNIQUE는 NULL 허용 — NULL은 중복 체크에서 제외됨 (NULL 여러 개 가능)
- 6. FK는 PK 또는 UNIQUE만 참조 — 일반 컬럼은 참조할 수 없음
- 7. CTAS는 NOT NULL만 복사 — PK, FK, CHECK 등 다른 제약조건은 복사되지 않음
- 8. Oracle MODIFY vs SQL Server ALTER COLUMN — 컬럼 수정 구문이 DBMS마다 다름
- 9. CASCADE CONSTRAINT — DROP TABLE 시 참조하는 FK도 함께 삭제
- 10. ON DELETE CASCADE vs SET NULL — 부모 행 삭제 시 자식 행 처리 방식의 차이
개념을 확인했다면 문제로 실력을 검증해보세요