CodeGym /행동 /SQL SELF /컬럼 데이터 타입 변경하기

컬럼 데이터 타입 변경하기

SQL SELF
레벨 18 , 레슨 1
사용 가능

상상해봐, 너가 대학을 위한 학생 테이블을 만들고 있어. 또! :)

처음엔 나이 필드 age를 정수형으로 하고 싶어서 SMALLINT 타입(숫자 -32,768부터 32,767까지 가능)을 썼어. 근데 시간이 지나고, 데이터베이스가 커지면서 다른 나라 학생들도 추가하게 됐는데, 그 학생들은 나이를... 생일로부터 지난 일(day) 수로 적는 거야! 이제 SMALLINT로는 부족하지 — 예를 들어 INTEGER로 바꿔야겠지.

이 외에도 데이터 타입을 바꿔야 하는 흔한 상황들이 있어:

  1. 숫자 범위를 늘리거나 줄여야 할 때.
  2. 문자열 길이를 바꿔야 할 때 (예: VARCHAR(50)에서 VARCHAR(100)으로).
  3. 최적화를 위해 데이터 타입을 바꿀 때 (예: TEXTVARCHAR로).
  4. 처음에 컬럼 타입을 잘못 골랐을 때 (예: 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로 저장하면 필터링이나 정렬이 불편하지. 해결책? TEXTDATE로 바꿔보자:

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이 꼭 필요한 경우?

  • 직접적인 타입 변환이 안 될 때.
  • 데이터를 변형해야 할 때.
  • 타입이 호환되지 않을 때 (TEXTBOOLEAN, VARCHARINTEGER 등).

데이터 타입 변경 시 흔한 실수

데이터 변환 없이 변경하려다 생기는 에러. 데이터를 새 타입으로 자동 변환할 수 없으면, 꼭 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을 잊지 마! 데이터 타입이 완전히 달라질 때(TEXTNUMERIC 등) USING이 진짜 구세주야.

이제 PostgreSQL에서 컬럼 데이터 타입 바꾸는 법 알았지? 다음에 데이터 구조를 바꿔야 할 때, 자신감 있게 할 수 있을 거야. 테이블도 똑똑하지만, 가끔은 업그레이드가 필요하니까!

2
과제
SQL SELF, 레벨 18, 레슨 1
잠금
문자열 길이 늘리기
문자열 길이 늘리기
2
과제
SQL SELF, 레벨 18, 레슨 1
잠금
날짜 컬럼 변환하기
날짜 컬럼 변환하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION