DDL과 제약조건
CREATE·ALTER·DROP·TRUNCATE와 PK·FK·UNIQUE·NOT NULL·CHECK의 올바른 선언을 익힌다.
핵심 요약
CREATE·ALTER·DROP·TRUNCATE와 PK·FK·UNIQUE·NOT NULL·CHECK의 올바른 선언을 익힌다.
핵심 질문
- DDL과 제약조건에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
- 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
- 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
- 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?
학습 목표
- 주요 DDL의 목적과 데이터·구조에 미치는 영향을 구분한다.
- 컬럼·테이블 수준 제약조건 문법을 올바르게 작성한다.
개념 지도
객체 정의 → 데이터 타입·제약조건 → DDL 실행 → 암시적 Commit·의존성 확인
핵심 내용
DDL은 데이터 구조를 정의한다. CREATE는 객체 생성, ALTER는 구조 변경, DROP은 객체 제거, TRUNCATE는 테이블 구조를 남기고 전체 행을 빠르게 제거한다.
CREATE TABLE product (
prod_id VARCHAR2(10) NOT NULL,
prod_nm VARCHAR2(100) NOT NULL,
reg_dt DATE NOT NULL,
regr_no NUMBER(10),
CONSTRAINT product_pk PRIMARY KEY (prod_id)
);
PRIMARY KEY는 유일성과 NOT NULL을 함께 보장한다. UNIQUE는 후보키의 유일성, FOREIGN KEY는 참조 무결성, CHECK는 행 값의 조건을 검증한다. NOT NULL은 Oracle에서 컬럼 정의에 선언하는 방식이 일반적이다.
ALTER TABLE product ADD CONSTRAINT product_pk
PRIMARY KEY (prod_id);
흔한 오해와 주의점
PRIMARY KEY product_pk ON (prod_id)는 올바른 제약조건 문법이 아니다.DROP과TRUNCATE는 구조 보존 여부가 다르다.- Oracle DDL은 트랜잭션 경계에 영향을 주며 일반 DML처럼 단순 ROLLBACK되는 것으로 생각하면 안 된다.
문항 풀이 보강: DDL·제약조건을 실제 문법으로 판정하기
컬럼과 테이블 제약
CREATE TABLE orders (
order_id NUMBER,
customer_id NUMBER,
status VARCHAR2(10) DEFAULT 'READY' NOT NULL,
amount NUMBER CHECK (amount >= 0),
CONSTRAINT orders_pk PRIMARY KEY (order_id),
CONSTRAINT orders_fk FOREIGN KEY (customer_id)
REFERENCES customer(customer_id)
);
PRIMARY KEY는 UNIQUE와 NOT NULL을 함께 보장한다. UNIQUE는 DBMS에 따라 NULL 허용과 중복 NULL 처리 세부가 다를 수 있다. CHECK는 행 값의 조건을, DEFAULT는 값을 생략했을 때의 기본값을 정의한다.
참조 동작
| 동작 | 부모 삭제·변경 시 자식 처리 |
|---|---|
RESTRICT / NO ACTION | 참조 자식이 있으면 거부 |
CASCADE | 자식 행도 삭제하거나 FK 값을 함께 변경 |
SET NULL | 자식 FK를 NULL로 변경 |
SET DEFAULT | 자식 FK를 기본값으로 변경 |
연쇄 참조 T ← S ← R에서 ON DELETE CASCADE가 각 관계에 정의되면 T의 부모 행 삭제가 S와 R까지 전파될 수 있다.
CREATE와 ALTER
ALTER TABLE product
ADD CONSTRAINT product_pk PRIMARY KEY (prod_id);
SQL Server에서 컬럼 타입 변경은 ALTER TABLE employee ALTER COLUMN salary DECIMAL(12,2), Oracle에서는 ALTER TABLE employee MODIFY salary NUMBER(12,2)를 사용한다. 문제에 DBMS가 명시되면 문법을 섞지 않는다.
DELETE·TRUNCATE·DROP
| 명령 | 분류 | 행 로그·조건 | 구조 | 일반적 롤백 |
|---|---|---|---|---|
| DELETE | DML | WHERE 가능, 행 단위 처리 | 유지 | 가능 |
| TRUNCATE | DDL | 전체 행, 공간 초기화에 유리 | 유지 | Oracle에서 불가 |
| DROP | DDL | 객체 전체 제거 | 제거 | Oracle에서 불가 |
삭제 이력을 남겨야 하고 조건별 로그가 필요하면 DELETE가 적합하다. 구조를 남기고 전체 데이터를 빠르게 제거하며 사용 공간을 초기화하려면 TRUNCATE를 검토한다.
문제에 적용하는 순서
- 필수·유일·참조·범위 중 어떤 규칙인지 찾는다.
- 컬럼 정의 내부인지 ALTER 문인지에 맞는 문법을 고른다.
- 부모 삭제 시 원하는 자식 동작을 확인한다.
- 데이터만 제거하는지, 구조도 제거하는지, 롤백·로그가 필요한지 구분한다.
결과를 검증하는 순서
- 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
- 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
- NULL 비교가
TRUE,FALSE,UNKNOWN중 무엇인지 구분합니다. - 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
- 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.
실무와 시험에서 함께 확인할 항목
ORDER BY가 없다면 결과 순서를 가정하지 않습니다.- 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
- 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
- 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.
마지막 점검
- 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
- NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.- 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.
복습 문제
- 필수 속성과 PK 속성은 각각 어떤 제약으로 구현하는가?
- 전체 행을 제거하되 테이블 구조를 남기는 명령은?
- 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
- NULL이 포함될 때 결과가 달라지는 지점은 어디인가?