ALTER TABLE ...ALTER COLUMN

本主题介绍如何使用 ALTER TABLE 语句中的 ALTER COLUMN 子句修改表的一个或多个列属性。

下表描述了修改列属性时受支持/不受支持的操作:

操作

支持

不支持

备注

默认值

删除列的默认值(即 DROP DEFAULT)。

✔

如果列和默认值由 ALTER TABLE 命令定义,则不允许使用。有关详细信息,请参阅下面的 使用说明。

更改列的默认序列(即 SET DEFAULT seq_name.NEXTVAL)。

✔

仅可用于已具有序列的列。

更改列的默认值,除非默认值是序列。

✔

为列添加默认值。

✔

可空性

更改列的可空性(即 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))。

✔

注释

设置或取消设置列的注释。

✔

掩码策略

设置或取消设置列的 掩码策略。

✔

投影策略

在列上设置或取消设置 投影策略。

✔

Object Tagging

设置或取消设置列的 标签。

✔

一列最多可以支持 20 个标签,一个标签字符串值的最大字符数为 256。

另请参阅:

ALTER TABLE、CREATE TABLE、DROP TABLE、SHOW TABLES、DESCRIBE TABLE

语法

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

使用说明

  • 单个 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 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。

示例

示例设置:

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
;