테이블에 컬럼 추가하기
여기서는 clickhouse-local을 사용합니다:
clickhouse -m --output_format_pretty_row_numbers=다음과 같은 테이블이 있다고 가정해 보겠습니다:
CREATE TABLE events (
date Date DEFAULT today(),
name String
)
ENGINE = MergeTree
ORDER BY date;레코드 1개를 추가해 보겠습니다:
INSERT INTO events (name) VALUES ('Alexey');이제 events 테이블에 쿼리를 실행하세요:
SELECT *
FROM events;┌───────date─┬─name───┐
│ 2024-12-18 │ Alexey │
└────────────┴────────┘새 컬럼 추가
이제 Float64 타입의 favoriteNumber라는 새 컬럼을 추가해 보겠습니다.
이는 ALTER TABLE...ADD COLUMN 절을 사용해 수행할 수 있습니다:
ALTER TABLE events
ADD COLUMN favoriteNumber Float64 DEFAULT 7;events 테이블을 쿼리하면 다음과 같은 출력이 표시됩니다:
┌───────date─┬─name───┬─favoriteNumber─┐
│ 2024-12-18 │ Alexey │ 7 │
└────────────┴────────┴────────────────┘Alexey 행은 해당 행을 추가할 당시 그 컬럼이 존재하지 않았으므로 기본값이 7로 설정됩니다.
다음으로 다른 컬럼을 하나 추가해 보겠습니다:
INSERT INTO events (name) VALUES ('Tyler');events 테이블을 쿼리하면 다음과 같은 출력이 표시됩니다:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │ 7 │
└────────────┴────────┴────────────────┘컬럼 기본값 수정
ALTER TABLE...MODIFY COLUMN 절을 사용해 favoriteNumber 컬럼의 데이터 유형을 다르게 변경하면 흥미로운 상황이 발생합니다:
ALTER TABLE events
MODIFY COLUMN favoriteNumber Float64 DEFAULT 99;events를 다시 쿼리하면 다음 출력이 표시됩니다:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Alexey │ 99 │
└────────────┴────────┴────────────────┘Tyler는 해당 행이 생성될 때의 기본값이었던 7을 유지합니다.
Alexey는 해당 행이 생성될 때 favoriteNumber 컬럼이 존재하지 않았기 때문에 새로운 기본값 99를 사용합니다.
Alexey 행이 즉시 현재 기본값을 사용하게 하려면, 현재 기본값이 디스크에 기록되도록 OPTIMIZE TABLE 을 호출해야 합니다:
OPTIMIZE TABLE events;이렇게 한 뒤, 기본값을 다시 변경한다고 가정해 보겠습니다:
ALTER TABLE events
MODIFY COLUMN favoriteNumber Float64 DEFAULT 21;그런 다음 다른 행을 하나 더 삽입합니다:
INSERT INTO events (name) VALUES ('Tanya');마지막으로, events에 다시 한 번 쿼리해 보겠습니다:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ 99 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tyler │ 7 │
├────────────┼────────┼────────────────┤
│ 2024-12-18 │ Tanya │ 21 │
└────────────┴────────┴────────────────┘Tanya는 새로운 기본값인 21을 사용하지만, Alexey는 기존 기본값인 99를 사용합니다.
테이블에서 컬럼 위치 제어
새 컬럼을 추가하면 기본적으로 테이블 맨 끝에 추가됩니다.
하지만 FIRST 및 AFTER 절을 사용하면 컬럼의 위치를 제어할 수 있습니다.
예를 들어, name 컬럼 뒤에 favoriteColor라는 컬럼을 추가하려면 다음과 같이 합니다:
ALTER TABLE events
ADD COLUMN favoriteColor String DEFAULT 'Yellow' AFTER name;이제 events를 쿼리해 보겠습니다:
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ date ┃ name ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ 2024-12-18 │ Alexey │ Yellow │ 99 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tyler │ Yellow │ 7 │
├────────────┼────────┼───────────────┼────────────────┤
│ 2024-12-18 │ Tanya │ Yellow │ 21 │
└────────────┴────────┴───────────────┴────────────────┘그리고 favoriteDatabase 컬럼을 추가해 목록의 맨 앞에 오도록 하려면 다음과 같이 하면 됩니다:
ALTER TABLE events
ADD COLUMN favoriteDatabase String DEFAULT 'ClickHouse' FIRST;┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ favoriteDatabase ┃ date ┃ name ┃ favoriteColor ┃ favoriteNumber ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ ClickHouse │ 2024-12-18 │ Tanya │ Yellow │ 21 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse │ 2024-12-18 │ Alexey │ Yellow │ 99 │
├──────────────────┼────────────┼────────┼───────────────┼────────────────┤
│ ClickHouse │ 2024-12-18 │ Tyler │ Yellow │ 7 │
└──────────────────┴────────────┴────────┴───────────────┴────────────────┘이제 table definition을 살펴보겠습니다:
SHOW CREATE TABLE events
FORMAT LineAsStringCREATE TABLE default.`clickhouse-local-ab404c86-56cc-495b-ad1d-fb343cac3bc0events`
(
`favoriteDatabase` String DEFAULT 'ClickHouse',
`date` Date DEFAULT today(),
`name` String,
`favoriteColor` String DEFAULT 'Yellow',
`favoriteNumber` Float64 DEFAULT 21
)
ENGINE = MergeTree
ORDER BY date