상상해봐, 너가 대학을 위한 학생 테이블을 만들고 있어. 또! :)
처음엔 나이 필드 age를 정수형으로 하고 싶어서 SMALLINT 타입(숫자 -32,768부터 32,767까지 가능)을 썼어. 근데 시간이 지나고, 데이터베이스가 커지면서 다른 나라 학생들도 추가하게 됐는데, 그 학생들은 나이를... 생일로부터 지난 일(day) 수로 적는 거야! 이제 SMALLINT로는 부족하지 — 예를 들어 INTEGER로 바꿔야겠지.
이 외에도 데이터 타입을 바꿔야 하는 흔한 상황들이 있어:
- 숫자 범위를 늘리거나 줄여야 할 때.
- 문자열 길이를 바꿔야 할 때 (예:
VARCHAR(50)에서VARCHAR(100)으로). - 최적화를 위해 데이터 타입을 바꿀 때 (예:
TEXT를VARCHAR로). - 처음에 컬럼 타입을 잘못 골랐을 때 (예:
BOOLEAN대신INTEGER로 해야 했던 경우).
데이터 타입 변경 명령어 문법
PostgreSQL에서 컬럼의 데이터 타입을 바꿀 땐 ALTER TABLE 명령어를 써. 이걸로 테이블 구조를 새로운 요구에 맞게 바꿀 수 있어.
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type;
진짜 간단하지: 테이블 이름, 바꿀 컬럼, 그리고 새 데이터 타입만 지정하면 돼.
예시 1: INTEGER에서 BIGINT로 변경
학생 테이블이 있다고 해보자:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INTEGER
);
다 괜찮았는데, 나이가 수백만 년이 넘어가면(묻지 마, 그냥 예시야!) PostgreSQL이 불안해하니까, age 컬럼을 INTEGER에서 BIGINT로 바꿔보자:
ALTER TABLE students
ALTER COLUMN age TYPE BIGINT;
예시 2: 문자열 길이 늘리기
강의 정보를 저장하는 테이블을 만들었고, 이름은 50자까지라고 했어:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
근데 알고 보니 강의 이름이 훨씬 더 길고 복잡하더라구. 이럴 땐 이렇게 해결하면 돼:
ALTER TABLE courses
ALTER COLUMN name TYPE VARCHAR(150);
예시 3: 타입 변환
예를 들어, birth_date 필드가 텍스트로 저장된 테이블이 있다고 해보자:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
birth_date TEXT
);
날짜를 TEXT로 저장하면 필터링이나 정렬이 불편하지. 해결책? TEXT를 DATE로 바꿔보자:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING birth_date::DATE;
USING birth_date::DATE 부분에 주목! 이건 PostgreSQL에게 타입 바꾸기 전에 데이터를 변환하라고 알려주는 거야.
왜 명시적인 데이터 변환이 필요할까?
PostgreSQL이 타입을 바꿀 때, 기존 데이터를 새 타입에 맞게 자동으로 바꿔보려고 해. 근데 이게 불가능하면 에러가 나. 예를 들어, TEXT에서 INTEGER로 바꿀 때, 텍스트 데이터를 어떻게 해석할지 안 알려주면 실패해.
문제 예시
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- 에러: 'not a date' 값을 DATE 타입으로 변환할 수 없어.
이 문제는 이렇게 해결할 수 있어. USING으로 데이터 변환을 명시해주면 돼:
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE USING to_date(birth_date, 'YYYY-MM-DD');
여기선 to_date() 함수를 써서 문자열을 날짜 포맷으로 바꿔주는 거야.
USING 명령어
PostgreSQL에서 ALTER TABLE ... ALTER COLUMN ... TYPE으로 컬럼 타입을 바꿀 때, 기존 데이터를 어떻게 변환할지 USING 키워드로 지정할 수 있어.
문법:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE new_data_type
USING expression;
설명:
USING은 값 변환 공식을 명확하게 지정할 수 있게 해줘.- 이건 자동 변환이 불가능하거나 애매할 때 특히 유용해.
간단 예시: 문자열 → 숫자
ALTER TABLE users
ALTER COLUMN age TYPE INTEGER
USING age::INTEGER;
여기서 age는 원래 TEXT였고, INTEGER로 바꾸고 싶을 때 USING age::INTEGER로 명시적으로 타입 변환을 해주는 거야.
예시: 텍스트 → 날짜
ALTER TABLE events
ALTER COLUMN event_date TYPE DATE
USING TO_DATE(event_date, 'YYYY-MM-DD');
event_date가 '2023-10-25' 같은 텍스트였다면, PostgreSQL에게 이걸 DATE 타입으로 바꾸는 방법을 알려주는 거지.
USING이 꼭 필요한 경우?
- 직접적인 타입 변환이 안 될 때.
- 데이터를 변형해야 할 때.
- 타입이 호환되지 않을 때 (
TEXT→BOOLEAN,VARCHAR→INTEGER등).
데이터 타입 변경 시 흔한 실수
데이터 변환 없이 변경하려다 생기는 에러. 데이터를 새 타입으로 자동 변환할 수 없으면, 꼭 USING으로 변환 방법을 지정해줘야 해.
ALTER TABLE employees
ALTER COLUMN birth_date TYPE DATE;
-- 에러: 'birth_date' 컬럼에 DATE 타입에 맞지 않는 값이 있음
작업 중 테이블이 잠길 수 있음. 데이터 타입을 바꾸면, 작업이 끝날 때까지 테이블이 쓰기 잠금될 수 있어. 특히 큰 테이블일수록 주의! 트래픽 적은 시간에 작업하는 게 좋아.
연관 테이블, 외래키 문제. 컬럼이 외래키에 포함되어 있으면, 타입 변경이 더 복잡해질 수 있어. PostgreSQL이 외래키를 다시 만들어야 할 수도 있거든.
꿀팁
항상 현재 데이터를 체크해봐. SELECT DISTINCT column_name 같은 쿼리로, 에러 없이 변환 가능한지 먼저 확인해봐.
변경 전 테스트해봐. 테이블을 임시로 복사해서 먼저 실험해보는 게 좋아. 예를 들면:
CREATE TEMP TABLE temp_students AS SELECT * FROM students;
USING을 잊지 마! 데이터 타입이 완전히 달라질 때(TEXT → NUMERIC 등) USING이 진짜 구세주야.
이제 PostgreSQL에서 컬럼 데이터 타입 바꾸는 법 알았지? 다음에 데이터 구조를 바꿔야 할 때, 자신감 있게 할 수 있을 거야. 테이블도 똑똑하지만, 가끔은 업그레이드가 필요하니까!
GO TO FULL VERSION