ALTER TABLE 문

ALTER TABLE 문

ALTER TABLE 문은 카탈로그에 있는 기존 테이블의 스키마를 변경해요. 컬럼을 추가·삭제하거나 타입을 바꾸고, 기본값을 설정하고, 테이블이나 컬럼 이름을 바꾸는 등 다양한 작업을 한 번에 처리할 수 있어요.

출처: 문서

본문

예제

CREATE TABLE integers (i INTEGER, j INTEGER);

integers 테이블에 이름이 k인 새 컬럼을 추가해요. 기본값 NULL로 채워져요.

ALTER TABLE integers
ADD COLUMN k INTEGER;

integers 테이블에 이름이 l인 새 컬럼을 추가해요. 기본값 10으로 채워져요.

ALTER TABLE integers
ADD COLUMN l INTEGER DEFAULT 10;

integers 테이블에서 k 컬럼을 삭제해요.

ALTER TABLE integers
DROP k;

표준 cast를 사용해 i 컬럼의 타입을 VARCHAR로 변경해요.

ALTER TABLE integers
ALTER i TYPE VARCHAR;

지정한 표현식으로 각 행의 데이터를 변환하면서 i 컬럼의 타입을 VARCHAR로 변경해요.

ALTER TABLE integers
ALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);

컬럼의 기본값을 설정해요.

ALTER TABLE integers
ALTER COLUMN i SET DEFAULT 10;

컬럼의 기본값을 삭제해요.

ALTER TABLE integers
ALTER COLUMN i DROP DEFAULT;

컬럼을 not nullable로 만들어요.

ALTER TABLE integers
ALTER COLUMN i SET NOT NULL;

not-NULL 제약을 삭제해요.

ALTER TABLE integers
ALTER COLUMN i DROP NOT NULL;

테이블 이름을 변경해요.

ALTER TABLE integers
RENAME TO integers_old;

테이블의 컬럼 이름을 변경해요.

ALTER TABLE integers
RENAME i TO ii;

테이블의 컬럼에 기본 키를 추가해요.

ALTER TABLE integers
ADD PRIMARY KEY (i);

문법

ALTER TABLE은 기존 테이블의 스키마를 변경해요. ALTER TABLE로 만든 모든 변경은 트랜잭션 시맨틱을 완전히 따르므로, 커밋되기 전까지 다른 트랜잭션에는 보이지 않고 롤백을 통해 완전히 되돌릴 수 있어요.

RENAME TABLE

테이블 이름을 변경해요.

ALTER TABLE integers
RENAME TO integers_old;

RENAME TO 절은 테이블 전체의 이름을 바꾸고, 스키마에서 이름을 변경해요. 이 테이블에 의존하는 뷰는 자동으로 업데이트되지 않는다는 점에 주의해요.

RENAME COLUMN

테이블의 컬럼 이름을 바꾸려면 RENAME 또는 RENAME COLUMN 절을 사용해요.

ALTER TABLE integers 
RENAME COLUMN i TO j;
ALTER TABLE integers
RENAME i TO j;

RENAME [COLUMN] 절은 테이블 내 단일 컬럼의 이름을 바꿔요. 이 이름에 의존하는 제약(예: CHECK 제약)은 자동으로 업데이트돼요. 다만 이 컬럼 이름에 의존하는 뷰는 자동으로 업데이트되지 않는다는 점에 주의해요.

ADD COLUMN

테이블에 컬럼을 추가하려면 ADD 또는 ADD COLUMN 절을 사용해요.

예를 들어 integers 테이블에 이름이 k인 새 컬럼을 추가해요. 기본값 NULL로 채워져요.

ALTER TABLE integers
ADD COLUMN k INTEGER;

또는:

ALTER TABLE integers
ADD k INTEGER;

integers 테이블에 이름이 l인 새 컬럼을 추가해요. 기본값 10으로 채워져요.

ALTER TABLE integers
ADD COLUMN l INTEGER DEFAULT 10;

ADD [COLUMN] 절은 지정한 타입의 새 컬럼을 테이블에 추가해요. 새 컬럼은 지정한 기본값으로 채워지며, 지정하지 않으면 NULL로 채워져요.

DROP COLUMN

테이블의 컬럼을 삭제하려면 DROP 또는 DROP COLUMN 절을 사용해요.

예를 들어 integers 테이블에서 k 컬럼을 삭제하면:

ALTER TABLE integers
DROP COLUMN k;

또는:

ALTER TABLE integers
DROP k;

DROP [COLUMN] 절은 테이블에서 컬럼을 제거해요. 이 컬럼에 의존하는 인덱스가 없을 때만 삭제할 수 있다는 점에 주의해요. 여기에는 PRIMARY KEY 또는 UNIQUE 제약의 일부로 생성된 인덱스도 포함돼요. 다중 컬럼 check 제약의 일부인 컬럼도 삭제할 수 없어요. 인덱스가 있는 컬럼을 삭제하려고 하면 DuckDB는 다음과 같은 오류 메시지를 반환해요.

Dependency Error:
Cannot alter entry "..." because there are entries that depend on it.

[SET [DATA]] TYPE

표준 cast를 사용해 i 컬럼의 타입을 VARCHAR로 변경해요.

ALTER TABLE integers
ALTER i TYPE VARCHAR;

ALTER ⟨column_name⟩ TYPE ⟨type⟩ 대신 동등한 ALTER ⟨column_name⟩ SET TYPE ⟨type⟩ALTER ⟨column_name⟩ SET DATA TYPE ⟨type⟩ 절도 사용할 수 있어요.

지정한 표현식으로 각 행의 데이터를 변환하면서 i 컬럼의 타입을 VARCHAR로 변경해요.

ALTER TABLE integers
ALTER i SET DATA TYPE VARCHAR USING concat(i, '_', j);

[SET [DATA]] TYPE 절은 테이블에서 컬럼의 타입을 변경해요. 컬럼에 있는 데이터는 USING 절의 표현식에 따라 변환되며, USING 절이 없으면 새 데이터 타입으로 cast돼요. 이 컬럼에 의존하는 인덱스가 없고 CHECK 제약의 일부가 아닐 때만 타입을 변경할 수 있다는 점에 주의해요.

Struct 다루기

STRUCT 타입 컬럼의 서브 스키마를 변경하는 방법은 두 가지가 있어요.

ALTER TABLEstruct_insert

ALTER TABLEstruct_insert 함수를 함께 사용할 수 있어요. 예를 들어:

CREATE TABLE tbl (col STRUCT(i INTEGER));
ALTER TABLE tbl
ALTER col TYPE USING struct_insert(col, a := 42, b := NULL::VARCHAR);
ALTER TABLEADD COLUMN / DROP COLUMN / RENAME COLUMN

DuckDB v1.3.0부터 ALTER TABLEADD COLUMN, DROP COLUMN, RENAME COLUMNSTRUCT의 서브 스키마를 업데이트하는 것을 지원해요.

SET / DROP DEFAULT

컬럼의 기본값을 설정해요.

ALTER TABLE integers
ALTER COLUMN i SET DEFAULT 10;

컬럼의 기본값을 삭제해요.

ALTER TABLE integers
ALTER COLUMN i DROP DEFAULT;

SET/DROP DEFAULT 절은 기존 컬럼의 DEFAULT 값을 수정해요. 이는 컬럼에 있는 기존 데이터를 수정하지 않는다는 점에 주의해요. 기본값을 삭제하는 것은 기본값을 NULL로 설정하는 것과 동일해요.

경고 현재 DuckDB는 의존성이 있으면 테이블을 변경할 수 없어요. 즉, 컬럼에 인덱스가 있으면 먼저 인덱스를 삭제하고, 테이블을 변경한 다음, 인덱스를 다시 생성해야 해요. 그렇지 않으면 Dependency Error가 발생해요.

ADD PRIMARY KEY

테이블의 컬럼에 기본 키를 추가해요.

ALTER TABLE integers
ADD PRIMARY KEY (i);

테이블의 여러 컬럼에 기본 키를 추가해요.

ALTER TABLE integers
ADD PRIMARY KEY (i, j);

SET / RESET (테이블 옵션)

이 기능은 DuckDB v1.5에 도입됐어요.

테이블 생성 후 테이블 옵션을 수정해요.

테이블 옵션 설정:

ALTER TABLE my_table
SET ('option_name' = 'value');

테이블 옵션을 기본값으로 리셋:

ALTER TABLE my_table
RESET ('option_name');

SET 절은 테이블 옵션에 키-값 쌍으로 값을 할당해요. RESET 절은 카탈로그 구현에 따라 옵션을 제거하거나 기본값으로 복원해요.

단일 문에서 여러 옵션을 설정하거나 리셋할 수 있어요.

ALTER TABLE my_table
SET ('option1' = 'value1', 'option2' = 'value2');

ALTER TABLE my_table
RESET ('option1', 'option2');

ADD / DROP CONSTRAINT

DuckDB는 아직 ADD CONSTRAINTDROP CONSTRAINT 절을 지원하지 않아요.

제한 사항

테이블에 충돌하는 타입의 값이 삭제된 후라도 어느 시점에든 발생했다면 ALTER COLUMN이 실패해요.

CREATE TABLE tbl (col VARCHAR);

INSERT INTO tbl
VALUES ('asdf'), ('42');

DELETE FROM tbl
WHERE col = 'asdf';

ALTER TABLE tbl
ALTER COLUMN col TYPE INTEGER;
Conversion Error:
Could not convert string 'asdf' to INT32

현재는 이것이 예상된 동작이에요. 해결 방법으로 테이블의 복사본을 만들 수 있어요.

CREATE OR REPLACE TABLE tbl AS FROM tbl;

더 알아보기 (Learn more)