예를 들어, 너가 대학교 데이터베이스를 설계한다고 해보자. 처음엔 학생 테이블에 ID랑 이름, 딱 두 개 필드만 있어. 완전 심플하게 시작해서 학생들이 시스템을 쓰기 시작하지. 근데 한 달쯤 지나니까 교수님들이 와서 "나이도 좀 추가해줄 수 있어?"라고 하고, 좀 있다가 "email도 필요해"라고 해. 그리고 나중엔 "아, middle_name 필드는 이제 빼자, 아무도 안 쓰잖아!" 이런 식으로 말하지. 이럴 때 ALTER TABLE로 컬럼을 추가하거나 삭제하는 스킬이 진짜 필요해지는 거야.
컬럼 추가 문법
자, PostgreSQL에서 기존 테이블에 새 컬럼을 추가하려면 ALTER TABLE 명령어를 써. 문법은 이래:
ALTER TABLE table_name
ADD COLUMN column_name data_type [constraints];
table_name— 새 컬럼을 추가할 테이블 이름이야.column_name— 추가할 컬럼 이름.data_type— 데이터 타입, 예를 들면VARCHAR,INTEGER,DATE이런 거.constraints(옵션) — 이 컬럼에 적용할 제약조건, 예를 들어NOT NULL,DEFAULT등등.
예시: 새 컬럼 추가하기
예를 들어, students라는 테이블이 이미 있다고 해보자:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
갑자기 학생 나이를 저장할 age 컬럼을 추가하라는 미션이 떨어졌어. 이렇게 하면 돼:
ALTER TABLE students
ADD COLUMN age INTEGER;
이제 students 테이블 구조가 이렇게 바뀌었지:
| id | name | age |
|---|---|---|
| 1 | Eva | NULL |
| 2 | Alex | NULL |
새로 레코드를 추가할 때 나이를 안 적으면 PostgreSQL이 자동으로 NULL을 넣어줘. 왜냐면 NOT NULL이나 DEFAULT 같은 제약조건을 안 걸었으니까.
컬럼 삭제 문법
컬럼을 테이블에서 삭제할 때도 ALTER TABLE 명령어를 써. 문법은 이래:
ALTER TABLE table_name
DROP COLUMN column_name [RESTRICT | CASCADE];
table_name— 컬럼을 삭제할 테이블 이름.column_name— 삭제할 컬럼 이름.RESTRICT— 컬럼에 참조가 있으면 삭제 금지(기본값).CASCADE— 컬럼이랑 관련된 모든 의존성까지 같이 삭제.
의존성까지 같이 삭제하는 CASCADE는 다음 레벨에서 더 자세히 알려줄게 :P
예시: 필요 없는 컬럼 삭제하기
다시 students 테이블로 돌아가자. 이제 age 필드가 필요 없어졌어. 삭제해보자:
ALTER TABLE students
DROP COLUMN age;
이제 테이블 구조가 다시 심플해졌지:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Alex |
꿀팁 예제들
제약조건 있는 컬럼 추가하기
만약 age 컬럼을 추가하면서 NOT NULL이랑 기본값까지 넣고 싶으면? 아래처럼 하면 돼:
ALTER TABLE students
ADD COLUMN age INTEGER NOT NULL DEFAULT 18;
이제 기존 모든 행의 age 값이 18로 채워지고, 새 레코드는 기본값을 쓰거나 직접 값을 꼭 넣어야 해.
의존성 있는 컬럼 삭제하기
어떤 컬럼이 뷰나 트리거 같은 데서 쓰이고 있으면 CASCADE 옵션을 써야 해. 근데 조심해야 돼! 이거 쓰면 DB의 다른 객체들도 같이 영향을 받을 수 있어. 예를 들면:
ALTER TABLE students
DROP COLUMN email CASCADE;
흔한 실수랑 특징들
실수: 컬럼에 잘못된 데이터 타입 쓰기.
예를 들어 INTEGER 타입 컬럼을 추가했는데 거기에 텍스트 데이터를 넣으려고 하면 PostgreSQL이 이해 못 하고 에러를 뱉어. 데이터 타입은 항상 실제 데이터랑 맞아야 해.
실수: 의존성 신경 안 쓰고 컬럼 삭제하기.
예를 들어, 인덱스나 외래키가 참조하는 컬럼을 그냥 삭제하면 CASCADE 옵션 없이 PostgreSQL이 에러를 낼 수 있어.
실수: 의존성 있는 컬럼 삭제하기. 예를 들어, 인덱스나 외래키가 참조하는 컬럼을 삭제하면 CASCADE 옵션 없이 PostgreSQL이 에러를 낼 수 있어. 옵션을 추가하면 네가 삭제한 컬럼을 참조하던 수천 개의 행도 같이 날아가. 그거 원래 삭제하면 안 되는 거였는데 : (
특징: 변경 작업 순서.
가끔 NOT NULL 같은 제약조건이 있는 컬럼을 추가할 땐 작업 순서가 중요해. 예를 들어, NOT NULL 컬럼을 추가하려면 먼저 기본값으로 다 채워줘야 하고, 안 그러면 PostgreSQL이 에러를 낼 거야.
GO TO FULL VERSION