ALTER TABLE …
ALTER TABLE … (열 수정)
기존 테이블의 열(column) 속성을 수정하는 명령이에요. 열의 기본값, NULL 허용 여부, 데이터 타입, 주석, 마스킹 정책, 프로젝션 정책, 태그 등을 변경할 수 있어요.
출처: 문서
본문
관련 명령: ALTER TABLE, CREATE TABLE, DROP TABLE, SHOW TABLES, DESCRIBE TABLE
아래 표는 열 속성 수정의 지원/미지원 동작을 설명해요.
| 작업 | 지원 | 미지원 | 설명 |
|---|---|---|---|
| 기본값 | |||
| 열의 기본값 제거 (DROP DEFAULT) | ✔ | 열과 기본값이 ALTER TABLE 명령으로 정의된 경우 허용되지 않아요. 자세한 내용은 아래 사용 메모 참고. | |
| 열의 기본 시퀀스 변경 (SET DEFAULT seq_name.NEXTVAL) | ✔ | 이미 시퀀스가 있는 열에만 사용해요. | |
| 시퀀스가 아닌 열의 기본값 변경 | ✔ | ||
| 열에 기본값 추가 | ✔ | ||
| NULL 허용 | |||
| 열의 NULL 허용 여부 변경 (SET NOT NULL 또는 DROP NOT NULL) | ✔ | ||
| 데이터 타입 | |||
| 열을 동의어 타입으로 변경 (예: STRING → VARCHAR) | ✔ | ||
| 열을 다른 타입으로 변경 (예: STRING → NUMBER) | ✔ | ||
| 텍스트 문자열 열 길이 증가 (예: VARCHAR(50) → VARCHAR(100)) | ✔ | ||
| 텍스트 문자열 열 길이 감소 (예: VARCHAR(50) → VARCHAR(25)) | ✔ | ||
| 바이너리 문자열 열 길이 증가 (예: BINARY(50) → BINARY(100)) | ✔ | ||
| 바이너리 문자열 열 길이 감소 (예: BINARY(50) → BINARY(25)) | ✔ | ||
| 숫자 열 정밀도 증가 (예: NUMBER(10,2) → NUMBER(20,2)) | ✔ | ||
| 숫자 열 정밀도 감소 (예: NUMBER(20,2) → NUMBER(10,2)) | ✔ | 새 정밀도가 현재 열의 모든 값을 담을 수 있는 경우에만 허용돼요. 또한 정밀도를 줄이면 Time Travel에 영향을 줄 수 있어요. | |
| 숫자 열 스케일 변경 (예: NUMBER(10,2) → NUMBER(10,4)) | ✔ | ||
| 주석 | |||
| 열의 주석 설정 또는 해제 | ✔ | ||
| 마스킹 정책 | |||
| 열에 마스킹 정책 설정 또는 해제 | ✔ | ||
| 프로젝션 정책 | |||
| 열에 프로젝션 정책 설정 또는 해제 | ✔ | ||
| 객체 태깅 | |||
| 열에 태그 설정 또는 해제 | ✔ | 열은 최대 20개 태그를 지원하며, 태그 문자열 값의 최대 문자 수는 256이에요. |
구문 (Syntax)
ALTER TABLE <name> { ALTER | MODIFY } [ ( ]
[ COLUMN ] <col1_name> DROP DEFAULT
, [ COLUMN ] <col1_name> SET DEFAULT <seq_name>.NEXTVAL
, [ COLUMN ] <col1_name> { [ SET ] NOT NULL | DROP NOT NULL }
, [ COLUMN ] <col1_name> [ [ SET DATA ] TYPE ] <type>
, [ COLUMN ] <col1_name> COMMENT '<string>'
, [ COLUMN ] <col1_name> UNSET COMMENT
[ , [ COLUMN ] <col2_name> ... ]
[ , ... ]
[ ) ]
ALTER TABLE <name> { ALTER | MODIFY } [ COLUMN ] dataGovnPolicyTagAction
사용 메모 (Usage notes)
- 하나의 ALTER TABLE 문으로 테이블의 여러 열을 수정할 수 있어요. 각 변경은 수정할 열과 열 속성으로 구성된 절로 지정하며, 쉼표로 구분해요:
- 문에서 절(수정할 열/속성) 목록을 시작하는 데
ALTER또는MODIFY키워드를 사용해요. - 절을 그룹화하는 데 괄호를 사용할 수 있지만 필수는 아니에요.
- 각 절에서
COLUMN키워드를 지정할 수 있지만 필수는 아니에요. - 절은 어떤 순서로도 지정할 수 있어요.
- 문에서 절(수정할 열/속성) 목록을 시작하는 데
- 열을
NOT NULL로 설정할 때 열에 NULL 값이 있으면 오류가 반환되고 열에 변경 사항이 적용되지 않아요. - 반정형 데이터 타입(ARRAY, OBJECT, VARIANT)을 사용하는 열은 테이블이 비어 있을 때를 제외하고
NOT NULL로 설정할 수 없어요. 테이블에 행이 있을 때 이러한 열을NOT NULL로 설정하는 것은 지원되지 않으며 오류가 발생해요. - 열의 기본 시퀀스를 변경하려면 열에 이미 기본 시퀀스가 있어야 해요.
ALTER TABLE ... SET DEFAULT <seq_name>명령으로 아직 시퀀스가 없는 열에 시퀀스를 추가할 수 없어요. DEFAULT값이 있는 열을 추가하도록 테이블을 변경하면 그 열의 기본값을 제거할 수 없어요. 예를 들어 다음 문 순서에서 마지막ALTER TABLE ... ALTER COLUMN문은 오류를 발생시켜요:
CREATE TABLE t(x INT);
INSERT INTO t VALUES (1), (2), (3);
ALTER TABLE t ADD COLUMN y INT DEFAULT 100;
INSERT INTO t(x) VALUES (4), (5), (6);
ALTER TABLE t ALTER COLUMN y DROP DEFAULT;
이 제한은 열이 추가되기 전에 삽입된 행과 추가된 후에 삽입된 행의 값 사이의 불일치를 방지해요. 기본값을 제거하면 열에는 다음이 포함될 거예요:
- 열이 추가되기 전에 삽입된 행에 대해 NULL 값.
- 열이 추가된 후에 삽입된 행에 대해 기본값.
테이블의 모든 클론에서도 기본 열 값을 제거하는 것이 금지돼요.
- 열의
TYPE을 설정할 때 지정된 타입(type)은 NUMBER 또는 텍스트 데이터 타입(VARCHAR, STRING, TEXT 등)이어야 해요. - NUMBER 데이터 타입의 경우
TYPE으로 다음을 수행할 수 있어요:- 지정된 숫자 열의 정밀도를 증가.
- 새 정밀도가 현재 열의 모든 데이터 값을 담을 수 있으면 지정된 숫자 열의 정밀도를 감소.
- 텍스트 데이터 타입의 경우
TYPE은 열의 길이를 늘리는 데만 사용할 수 있어요. - 열의 정밀도가 Time Travel에 유지된 열 데이터의 최대 정밀도 아래로 내려가면, 정밀도를 먼저 높이지 않고는 테이블을 복원할 수 없어요.
- 인터랙티브 테이블의 경우 현재 ALTER TABLE MODIFY COLUMN 명령과 함께 사용할 수 있는 절은 COMMENT와 UNSET COMMENT뿐이에요.
- 마스킹 정책:
USING절과FORCE키워드는 모두 선택사항이며, 열에 마스킹 정책을 설정하는 데 어느 것도 필수가 아니에요.USING절과FORCE키워드는 따로 또는 함께 사용할 수 있어요. 자세한 내용은 다음을 참고하세요:- 조건부 열을 사용하는 단일 마스킹 정책은 테이블의 열 구조가 정책에 지정된 열과 일치한다면 여러 테이블에 적용할 수 있어요.
- 마스킹 정책이 있는 하나 이상의 테이블 열이나 행 접근 정책이 있는 테이블 자체를 수정할 때는 POLICY_CONTEXT 함수를 사용해 마스킹 정책으로 보호된 열과 행 접근 정책으로 보호된 테이블에 대한 쿼리를 시뮬레이션해요.
- 메타데이터 관련(예:
COMMENT필드): Snowflake 서비스를 사용할 때 메타데이터로 개인 데이터(User 객체 외), 민감한 데이터, 수출 통제 데이터 또는 기타 규제 대상 데이터를 입력하지 않도록 주의해야 해요. 자세한 내용은 Snowflake의 메타데이터 필드를 참고하세요.
예시 (Examples)
예시 설정:
CREATE OR REPLACE TABLE t1 (
c1 NUMBER NOT NULL,
c2 NUMBER DEFAULT 3,
c3 NUMBER DEFAULT seq1.nextval,
c4 VARCHAR(20) DEFAULT 'abcde',
c5 STRING);
DESC TABLE t1;
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------|
| C1 | NUMBER(38,0) | COLUMN | N | NULL | N | N | NULL | NULL | NULL |
| C2 | NUMBER(38,0) | COLUMN | Y | 3 | N | N | NULL | NULL | NULL |
| C3 | NUMBER(38,0) | COLUMN | Y | DB1.PUBLIC.SEQ1.NEXTVAL | N | N | NULL | NULL | NULL |
| C4 | VARCHAR(20) | COLUMN | Y | 'abcde' | N | N | NULL | NULL | NULL |
| C5 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
t1에 대해 다음 변경을 수행해요:
- NOT NULL 열
c1을 NULL로 변경. - 열
c2의 기본값 제거 및 열c3의 기본 시퀀스 변경. - 열
c4의 길이 증가 및 열의 기본값 제거. - 열
c5에 주석 추가.
ALTER TABLE t1 ALTER COLUMN c1 DROP NOT NULL;
ALTER TABLE t1 MODIFY c2 DROP DEFAULT, c3 SET DEFAULT seq5.nextval ;
ALTER TABLE t1 ALTER c4 SET DATA TYPE VARCHAR(50), COLUMN c4 DROP DEFAULT;
ALTER TABLE t1 ALTER c5 COMMENT '50 character column';
DESC TABLE t1;
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment |
|------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------|
| C1 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| C2 | NUMBER(38,0) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| C3 | NUMBER(38,0) | COLUMN | Y | DB1.PUBLIC.SEQ5.NEXTVAL | N | N | NULL | NULL | NULL |
| C4 | VARCHAR(50) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL |
| C5 | VARCHAR(16777216) | COLUMN | Y | NULL | N | N | NULL | NULL | 50 character column |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+
이전 예시와 같지만 명령의 유연성을 보여주기 위한 변경과 함께:
- 모든 작업이 단일
ALTER COLUMN절에서 실행. - 절 안의 열 순서가 다름.
SET DATA TYPE이 단순히TYPE으로 축약.
ALTER TABLE t1 ALTER (
c1 DROP NOT NULL,
c5 COMMENT '50 character column',
c4 TYPE VARCHAR(50),
c2 DROP DEFAULT,
COLUMN c4 DROP DEFAULT,
COLUMN c3 SET DEFAULT seq5.nextval
);
이 예시는 같은 결과를 만들어요.
열 수준 보안 마스킹 정책을 테이블 열에 적용해요:
-- single column
ALTER TABLE empl_info MODIFY COLUMN empl_id SET MASKING POLICY mask_empl_id;
-- multiple columns
ALTER TABLE empl_info MODIFY
COLUMN empl_id SET MASKING POLICY mask_empl_id
, COLUMN empl_dob SET MASKING POLICY mask_empl_dob
;
테이블 열에서 열 수준 보안 마스킹 정책을 해제해요:
-- single column
ALTER TABLE empl_info modify column empl_id unset masking policy;
-- multiple columns
ALTER TABLE empl_info MODIFY
COLUMN empl_id UNSET MASKING POLICY
, COLUMN empl_dob UNSET MASKING POLICY
;
더 알아보기 (Learn more)
- ALTER TABLE — 테이블 수정
- CREATE TABLE — 테이블 만들기
- DESCRIBE TABLE — 테이블 설명