소스: sql-src/mid_08_ddl_constraints/01_create_alter.sql. dept·emp 테이블을 새로 만들며 CREATE·ALTER 의 기본 동작을 확인합니다.
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;ID | NAME | DEPT | SAL
---+--------+------+----
1 | 김철수 | 개발 | 500
2 | 이영희 | 영업 | 450
(2행)테이블 정의 안에 CONSTRAINT pk_dept PRIMARY KEY (code) 처럼 이름 붙은 PK 를 함께 선언했습니다. 컬럼마다 줄을 나눈 CREATE TABLE 형태는 컬럼이 늘어나도 한눈에 훑어보기 쉽습니다.
CREATE TABLE t_short (id INT PRIMARY KEY, name VARCHAR(5));
-- @error
INSERT INTO t_short VALUES (1, '가나다라마바사');예상 오류: 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 단계에서 걸러 줍니다.
ALTER TABLE emp ADD COLUMN grade VARCHAR(10) DEFAULT '미정';
SELECT id, name, grade FROM emp ORDER BY id;ID | NAME | GRADE
---+--------+------
1 | 김철수 | 미정
2 | 이영희 | 미정
(2행)이미 데이터가 있는 emp 에 grade 컬럼을 새로 추가하면서 DEFAULT '미정' 을 줬습니다. 새 컬럼을 추가하는 시점에 이미 있던 두 행에도 기본값 미정이 즉시 채워진 것을 확인할 수 있습니다.
ALTER TABLE dept ALTER COLUMN dname VARCHAR(40);
INSERT INTO dept VALUES ('인사', '인사관리지원팀(확장된 이름)', '서울');
SELECT code, dname FROM dept ORDER BY code;CODE | DNAME
-----+----------------------------
개발 | 개발팀
영업 | 영업팀
인사 | 인사관리지원팀(확장된 이름)
(3행)dname 은 원래 VARCHAR(20) 이라 20자를 넘는 부서명이 못 들어갔습니다. 폭을 VARCHAR(40) 으로 넓힌 뒤에는 긴 부서명도 정상적으로 들어갑니다. 기존 두 행의 값(개발팀·영업팀)은 폭을 넓혀도 그대로 남아 있습니다.
ALTER TABLE emp RENAME COLUMN grade TO rank_label;
SELECT id, name, rank_label FROM emp ORDER BY id;ID | NAME | RANK_LABEL
---+--------+-----------
1 | 김철수 | 미정
2 | 이영희 | 미정
(2행)grade 컬럼을 rank_label 로 이름만 바꿨습니다. 값은 그대로 유지되고, 이후 쿼리부터는 새 이름으로 접근해야 합니다. DB 마다 이름 변경 문법이 다르다는 점은 4절 응용 예제에서 다시 비교합니다.
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;CNT
---
0
(1행)TRUNCATE 전에는 3건이던 t_log 가 TRUNCATE 뒤 0건으로 줄었지만, 테이블 자체는 그대로 남아 바로 INSERT 할 수 있습니다. 이어서 DROP TABLE t_log 로 테이블을 아예 지우면, 그 뒤의 SELECT * FROM t_log 는 "테이블을 찾을 수 없음" 오류로 테이블 자체가 없어졌음을 보여줍니다.