테마
DDL: CREATE·ALTER·DROP
DDL(Data Definition Language, 데이터 정의어)은 테이블·뷰·인덱스(index) 같은 데이터베이스 구조를 만들고, 바꾸고, 지우는 SQL이다. 데이터 자체를 다루는 DML(Data Manipulation Language, 데이터 조작어)과 달리 그릇의 모양을 정한다. 시험은 명령어 세 개의 역할, ALTER TABLE의 빈칸, DROP의 CASCADE·RESTRICT 차이를 단답형으로 묻는다.
명령어 세 가지
| 명령어 | 하는 일 | 대상 예 |
|---|---|---|
CREATE | 새 객체를 만든다 | SCHEMA, DOMAIN, TABLE, VIEW, INDEX |
ALTER | 이미 있는 테이블 정의를 바꾼다 | TABLE |
DROP | 객체를 통째로 없앤다 | SCHEMA, DOMAIN, TABLE, VIEW, INDEX |
CREATE TABLE과 제약 조건
CREATE TABLE은 열 이름과 자료형을 정하면서 제약 조건(constraint)을 함께 건다. 제약 조건은 잘못된 값이 들어오지 못하게 막는 규칙이다. 기본키(primary key)는 행을 하나로 가려내는 열이라 중복과 NULL이 안 된다. 외래키(foreign key)는 다른 테이블의 기본키 값만 넣을 수 있게 한다.
sql
CREATE TABLE 수강 (
학번 INTEGER REFERENCES 학생(학번) ON DELETE CASCADE,
과목 VARCHAR(10) NOT NULL,
PRIMARY KEY (학번, 과목)
);NOT NULL은 빈 값 금지, UNIQUE는 중복 금지, CHECK (점수 BETWEEN 0 AND 100)은 값의 범위를 제한한다. ON DELETE CASCADE는 학생 행이 지워지면 그 학생의 수강 행도 따라 지우라는 뜻이다. 예제 수강 테이블(5행)에서 학생 1001을 지우자 1001의 수강 2행이 함께 지워져 3행이 됐다. 이 옵션이 없으면 참조 중인 행은 지울 수 없어 오류가 난다.
CREATE VIEW 이름 AS SELECT …는 조회 결과에 이름을 붙인 가상 테이블인 뷰(view)를 만든다. CREATE [UNIQUE] INDEX 이름 ON 테이블(열 [ASC|DESC])는 인덱스를 만든다. 인덱스는 열 값을 미리 정리해 두어 그 열로 조회할 때 전체 행을 훑지 않게 하는 구조다. UNIQUE를 붙이면 그 열에 중복 값이 들어오지 않고, 정렬 방향을 생략하면 ASC다.
ALTER TABLE
ALTER TABLE은 테이블을 지우지 않고 정의만 고친다. 데이터를 다시 넣을 필요가 없어서 운영 중인 테이블에 열을 추가할 때 쓴다.
| 형식 | 하는 일 |
|---|---|
ALTER TABLE 학생 ADD 전화 VARCHAR(20); | 열 추가 |
ALTER TABLE 학생 ALTER 학년 SET DEFAULT 1; | 열의 기본값 변경 |
ALTER TABLE 학생 DROP COLUMN 전화; | 열 삭제 |
열의 자료형 변경 문법은 제품마다 다르다. 표준은 ALTER COLUMN … SET DATA TYPE, PostgreSQL은 ALTER COLUMN … TYPE, Oracle·MySQL은 MODIFY를 쓴다. 시험 답안은 자료형 변경도 ALTER 열이름 새자료형 꼴로 쓰는데, 실제 DBMS는 이 형식을 받지 않는 시험 표기다.
DROP과 CASCADE·RESTRICT
DROP TABLE 학생 CASCADE;는 학생 테이블과 함께 이를 참조하는 뷰·제약 조건까지 지운다. RESTRICT는 다른 객체가 참조 중이면 삭제를 거부한다. PostgreSQL은 RESTRICT가 기본값이다. Oracle은 CASCADE CONSTRAINTS로 쓰고, MySQL은 두 키워드를 받기만 하고 아무 일도 하지 않는다.
DROP은 구조까지 없애고, DML의 DELETE는 행만 지우고 테이블은 남긴다. 둘 사이의 TRUNCATE는 구조를 남기고 모든 행을 한 번에 비운다.
시험 포인트
- 구조 정의 언어 → DDL: CREATE, ALTER, DROP.
- 열 추가 ADD, 기본값 변경 ALTER … SET DEFAULT, 열 삭제 DROP COLUMN.
- 참조하는 객체까지 함께 삭제 → CASCADE. 참조 중이면 거부 → RESTRICT.
- 중복 없는 인덱스 →
CREATE UNIQUE INDEX. 정렬 생략 시 ASC. - 테이블 자체 제거
DROPvs 행만 제거DELETE.
