更新时间:2026-10-21 GMT+08:00
分享

ALTER TABLE

功能描述

修改表的属性。包括:修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所属模式、添加/更新多个列以及打开/关闭行访问控制开关等。

注意事项

  • 基表为Hash分布时,若创建不包含基表分布键的主键索引或唯一索引,需要使用全局二级索引(指定BY GLOBAL INDEX字段);若创建包含基表分布键的主键索引或唯一索引,需要使用普通索引(不指定BY GLOBAL INDEX字段)。单DN部署形式下,使用全局二级索引或者普通索引均可创建不包含基表分布键的主键索引或唯一索引;当基表为非Hash分布形式时,只能使用普通索引创建不包含基表分布键的主键索引或唯一索引,即索引键必须包含基表分布键。
  • 表的所有者、被授予了表ALTER权限的用户或被授予ALTER ANY TABLE权限的用户有权限执行ALTER TABLE命令,系统管理员默认拥有此权限。但要修改表的所有者或者修改表的模式,当前用户必须是该表的所有者或者系统管理员,且在三权分立打开时,该用户必须是新所有者角色的成员。
  • 不能修改分区表的表空间,但可以修改分区的表空间。
  • 不支持修改存储参数ORIENTATION。
  • SET SCHEMA操作不支持修改为系统内部模式,当前仅支持用户模式之间的修改。
  • 不允许对表的分布列(distribute column)进行修改。
  • 不支持对分区表的分区键字段改变和转换字符集。
  • 不支持增加自增列,或者增加DEFAULT值中包含NEXTVAL()表达式的列。
  • rowid和rowno系统列不支持重命名、删除、设置默认值、修改列定义。
  • 不支持对外表、临时表开启行访问控制开关。
  • 不支持对系统列添加约束。
  • 通过约束名删除PRIMARY KEY约束时,不会删除NOT NULL约束,如果有需要,请手动删除NOT NULL约束。
  • 使用JDBC时,支持通过PrepareStatement对DEFAULT值进行参数化设置。
  • 如果用ADD COLUMN增加一个字段,表中已有的行的新增字段值均为DEFAULT子句指定的默认值。如果没有指定DEFAULT值,则已有行的新字段的值缺省为NULL。
  • 当新增列的字段默认值为NULL时,不会触发全表更新。
  • 新增列如果指定DEFAULT值,必须符合以下所有要求,否则会产生额外的全表更新开销,影响在线业务:
    • 新增列的DEFAULT值长度不超过128个字节。
    • 新增列的DEFAULT值不包含易变(volatile)函数,可通过PG_PROC系统表查看函数的provolatile属性是否为v进行判断是否存在volatile函数。
  • 在为数据对象增加或者变更ILM策略时,如果追加了行表达式,仅支持白名单中列出的函数作为行表达式。具体白名单函数列表请参见行表达式函数白名单。

    在ILM策略的ON ( EXPR )行级表达式支持的函数中,有部分函数的输出可能会受兼容性参数影响。例如,upper函数在MYSQL兼容模式下设置b_format_version='5.7'和b_format_dev_version='s2'后,将无法转大写。

  • 表约束个数不能超过32767个。
  • 执行在线DDL操作时,需预留足够的磁盘空间,即剩余空间是所操作的表(及其上索引等附属品)总和。
  • 在线DDL不支持在事务内执行(通过JDBC驱动执行多条SQL时会隐式启动事务,禁止多条SQL一起执行),不支持在存储过程中执行。
  • 如果用户取消在线DDL执行过程,首先进入残留清理流程,如果用户再次取消,则会结束清理流程导致残留。
  • 在线DDL与用户业务之间存在资源争抢,不适合大业务背景下进行在线DDL。对于资源有限的场景,建议采用细粒度资源管控进行操作,且不建议使用并行加速功能。
  • M-Compatibility模式数据库下不支持在线DDL操作。
  • 以下情况中,在线DDL操作将不会生效,DDL操作默认以离线方式执行,如果指定ONLINE关键字,则会产生请不要指定ONLINE关键字的提示。
    • 使用MODIFY column_name data_type { { [ COMMENT 'string' ] [ ... ] } |AUTO_INCREMENT }语法或MODIFY [ COLUMN ] column_name data_type [ CHARACTER SET |CHARSET charset ] [{[ COLLATE collation ] | [ column_constraint ]} [ ... ] ]语法在线修改列类型、精度或长度,子句包含COMMENT、AUTO_INCREMENT、CHARACTER SET、CHARSET、COLLATE等任一关键字或column_constraint。
    • 使用CHANGE [ COLUMN ] column_name new_column_name data_type[ CHARACTER SET | CHARSET charset ] [{[ COLLATE collation ] |[ column_constraint ]} [ ... ] ]语法在线修改列类型、精度或长度。
    • 在线将列类型修改或转换为SET数据类型。
    • 若ALTER TABLE语句包含当前在线DDL特性支持操作(包含在线修改列类型、精度、长度、表级在线移动表空间、在线添加非空约束、在线添加检查约束、在线添加主键约束、在线添加唯一约束)以外的操作。
    • 在线DDL(包含在线修改列类型、精度、长度以及表级在线移动表空间)操作的表上包含GSI或语句中包含BY GLOBAL INDEX关键字。
  • 对数据库级、索引级、二级分区表、段页式表、hash bucket表、临时表以及unlogged表进行在线DDL操作时(包含在线修改列类型、精度、长度、表级在线移动表空间、在线添加非空约束、在线添加检查约束、在线添加主键约束、在线添加唯一约束),在线DDL操作将不会生效,DDL操作默认以离线方式执行,并提示当前DDL语句不支持在线执行。
  • 长事务可能会阻塞在线DDL执行结果(包含在线修改列类型、精度、长度、表级在线移动表空间、在线添加非空约束、在线添加检查、在线添加主键约束以及在线添加唯一约束),建议避免在存在长事务时进行在线DDL操作。
  • 在线DDL(包含在线修改列类型、精度、长度、表级在线移动表空间、在线添加非空约束、在线添加检查约束、在线添加主键约束以及在线添加唯一约束)本特性执行后期将阻塞DQL、DML操作。因此,对于存在超时报错机制的业务模型可能出现阻塞导致的请求失败,若出现此类情况,可以进行重试。
  • 在线DDL执行期间,应尽量避免与其他DDL并发执行,否则可能会出现无响应以及报错等异常,请重新连接客户端进行重试。
  • 从不支持在线DDL操作的版本升级至支持在线DDL操作的版本,升级待观察期间不支持使用在线DDL操作(包含在线修改列类型、精度、长度、表级在线移动表空间、在线添加非空约束、在线添加检查约束、在线添加主键约束以及在线添加唯一约束),DDL默认以离线方式执行,并提示升级期间不支持在线DDL操作。
  • 在线DDL执行(包含在线修改列类型、精度、长度、表级在线移动表空间、在线添加非空约束、在线添加检查约束、在线添加主键约束以及在线添加唯一约束)过程中会生成指定的Schema,Schema命名格式为online$$ddl$$[(表所在的Schema 表名)的hash值]。
    • Schema的属主默认为初始用户,不建议在线DDL执行中操作此Schema,可能会导致中止在线DDL并产生未知错误。不建议用户对该Schema下的表格进行查询,gs_dump导出会默认不导出该Schema。
    • 用户不可创建online$$为前缀的Schema,否则会产生报错提示。若已存在同名Schema冲突,在线DDL操作将不会生效,DDL默认以离线方式执行,并提示Schema名冲突导致当前DDL语句不可在线。
  • 若在线DDL(包含在线修改列类型、精度、长度以及表级在线移动表空间)操作失败或者执行在线DDL(在线添加非空约束、在线添加检查、在线添加主键约束以及在线添加唯一约束),表上可能会存在明显存储空间膨胀,其中膨胀程度与DDL执行时长以及并发写操作数成正比,建议避免在存在长事务时进行在线DDL操作 。
  • 若在线DDL操作包含添加非空约束、添加检查、添加主键约束或添加唯一约束操作,当出现违反约束的数据进行报错时,报错信息会存在区别于离线DDL的情况。
  • 在线DDL操作涉及在线添加主键以及在线添加唯一约束时,若约束包含表达式,则默认以离线DDL的方式执行,若指定了ONLINE关键字,会提示当前DDL语句不可在线。
  • 在线DDL(包含在线修改列类型、精度、长度、表级在线移动表空间、在线添加非空约束、在线添加检查、在线添加主键约束以及在线添加唯一约束)操作继承CREATE TABLE LIKE的使用约束。
  • 避免同时执行在线DDL操作和扩缩容操作,否则可能会出现在线DDL或扩缩容执行失败的情况。

语法格式

  • 修改表的定义。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ]
     { table_name [*] | ONLY table_name | ONLY ( table_name ) }
        action [, ... ];
    
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name
        ADD ( { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] } [, ... ] );
    
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name
        MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ... ] );
    
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name
        RENAME [TO | AS | = ] new_table_name;
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ]
        { table_name [*] | ONLY table_name | ONLY ( table_name ) }
        RENAME [ COLUMN ] column_name TO new_column_name;
    
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ]
        { table_name [*] | ONLY table_name | ONLY ( table_name ) }
        RENAME CONSTRAINT constraint_name TO new_constraint_name;
    
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name
        SET SCHEMA new_schema;
    
    ALTER TABLE  [ OFFLINE | [ ONLINE [ WITH ( { online_parameter = value } [, ... ] ) ] ] ] [ IF EXISTS ] table_name
        GSIWAITALL;
    
    其中表操作action为:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    { distribute_clause
        [ DISTRIBUTE BY { REPLICATION | HASH ( column_name [,...] )
        | RANGE ( column_name [,...] ) { SLICE REFERENCES tablename | ( slice_less_than_item [,...] )
        | ( slice_start_end_item [,...] ) }
        | LIST ( column_name [,...] ) { SLICE REFERENCES tablename | ( slice_values_item [,...] ) }
        } ]
        [ TO { GROUP groupname | NODE ( nodename [,...] ) } ]
    column_clause
        | ADD table_constraint [ NOT VALID ]
        | ADD table_constraint_using_index
        | VALIDATE CONSTRAINT constraint_name
        | DROP CONSTRAINT [ IF EXISTS ]  constraint_name [ RESTRICT | CASCADE ]
        | DROP PRIMARY KEY
        | CLUSTER ON index_name
        | SET WITHOUT CLUSTER
        | SET WITH ROWID
        | SET ( {storage_parameter = value} [, ... ] )
        | RESET ( storage_parameter [, ... ] )
        | OWNER TO new_owner
        | SET TABLESPACE new_tablespace
        | SET { COMPRESS | NOCOMPRESS }
        | ADD NODE ( nodename [, ... ] )
        | DELETE NODE ( nodename [, ... ] )
        | UPDATE SLICE LIKE table_name
        | DISABLE TRIGGER { trigger_name | ALL | USER }
        | ENABLE TRIGGER { trigger_name | ALL | USER }
        | ENABLE REPLICA TRIGGER trigger_name
        | ENABLE ALWAYS TRIGGER trigger_name
        | ENABLE ROW LEVEL SECURITY
        | DISABLE ROW LEVEL SECURITY
        | FORCE ROW LEVEL SECURITY
        | NO FORCE ROW LEVEL SECURITY
        | ENCRYPTION KEY ROTATION
        | REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }
        | AUTO_INCREMENT [ = ] value
        | COMMENT [ = ] 'string'
        | [ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ]
        | ILM ADD POLICY ROW STORE COMPRESS ADVANCED [ MEDIUM | HIGH ] ROW AFTER n { day | days | month | months | year | years } OF NO MODIFICATION [ ON ( EXPR )]
        | [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE | DISABLE | DELETE } POLICY policy_name
        | [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE_ALL | DISABLE_ALL | DELETE_ALL}
        | [ COLVIEW | COLVIEW NOCOLVIEW | NOCOLVIEW COLVIEW] [ ( { column_name [, ... ]} ) ] [ PRIORITY { HIGH | LOW | NONE } ]
        | NOCOLVIEW }
    
    • ADD table_constraint [ NOT VALID ]

      为表增加新的约束。

    • ADD table_constraint_using_index

      根据已有唯一索引为表增加主键约束或唯一约束。目前不支持使用已有GSI索引为表进行ADD table_constraint_using_index操作。

    • VALIDATE CONSTRAINT constraint_name

      用于对使用NOT VALID选项创建的检查类约束的验证,通过扫描全表以保证所有记录都符合约束条件。如果约束已标记为有效时,该语法将不会对约束行为进行改变。

    • DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]

      删除表上的约束。

    • DROP PRIMARY KEY

      删除表上的主键约束。该语法仅在MYSQL兼容模式以及ORA兼容模式下支持使用。

    • CLUSTER ON index_name

      为CLUSTER聚簇操作选择默认索引。实际上并未对该表重新进行盘簇化处理。

    • SET WITHOUT CLUSTER

      从表中删除最新使用的CLUSTER索引。该语法会影响未声明默认索引的CLUSTER聚簇操作。

    • SET WITH ROWID

      为表添加rowid、rowno系统列,并设置表的存储选项hasrowid = on。

      • 该语法不支持用于系统表、本地临时表、全局临时表、Unlogged表、外表、hashbucket表、复制表。
      • 该语法不支持用于启用oid系统列或gs_tuple_uid系统列的表,即指定oids存储选项(或WITH OIDS子句)、hasuids存储选项的表。
      • 该语法不支持用于包含列名为rowid或者rowno的表。
      • 该语法仅在ORA兼容性下有效。
      • 对处于压缩状态的数据执行SET WITH ROWID操作后,该部分数据将被自动解压。
    • SET ( {storage_parameter = value} [, ... ] )

      修改表的一个或多个存储参数。

      当table_name为索引名时,ACTIVE_PAGES表示索引的页面数量,可能比实际的物理文件页面少,可以用于优化器调优。目前只对Ustore的分区表LOCAL索引生效,且会被VACUUM、ANALYZE更新(包括AUTO VACUUM)。不建议用户手动设置该参数,该参数在分布式下无效。

    • RESET ( storage_parameter [, ... ] )

      重置表的一个或多个存储参数。与SET一样,根据参数的不同可能需要重新修改表才能获得预期的效果。

    • OWNER TO new_owner

      将表、序列或视图的属主修改为指定的用户。

      以下操作不被允许,若执行将会报错:

      1.系统管理员将表的owner更改为初始用户;

      2.三权分立模式下,系统管理员将表的owner更改为安全管理员或审计管理员。

    • SET TABLESPACE new_tablespace

      将表空间修改为指定的表空间并将相关的数据文件移动到指定的表空间。表上的所有索引都不会被移动,索引的表空间可以通过ALTER INDEX语法的SET TABLESPACE选项来修改。

    • DISTRIBUTE BY { REPLICATION | HASH ( column_name [, ...] ) | RANGE ( column_name [, ...] ) { SLICE REFERENCES tablename | ( slice_less_than_item [, ...] ) | ( slice_start_end_item [, ...] ) } | LIST ( column_name [, ...] ) { SLICE REFERENCES tablename | ( slice_values_item [, ...] ) }}

      指定表如何在节点之间分布或者复制,具体请参见CREATE TABLE中关于DISTRIBUTE BY的介绍。

    • TO { GROUP groupname | NODE ( nodename [, ... ] ) }

      仅在扩展模式(GUC参数support_extended_features为on时)下可用。该模式谨慎打开,主要为内部扩容工具使用,不建议用户使用该模式。该命令仅修改表分布节点的逻辑映射关系,并未在DN节点上迁移表的元数据和数据。

    • ADD NODE ( nodename [, ... ] )

      该语法主要为内部扩容工具使用,不建议用户直接使用。

    • DELETE NODE ( nodename [, ... ] )

      该语法主要为内部缩容工具使用,不建议用户直接使用。

    • UPDATE SLICE LIKE table_name

      该语法主要为内部扩缩容工具使用,不建议用户直接使用。

    • DISABLE TRIGGER { trigger_name | ALL | USER }

      禁用指定触发器。trigger_name表示禁用指定的单个触发器,ALL表示禁用所有触发器,USER表示仅禁用用户触发器(此选项不包括内部生成的约束触发器,例如,可延迟唯一性和排除约束的约束触发器)。

      请谨慎使用此功能,一旦执行禁用触发器,原先期望的约束的完整性将无法保证。

    • ENABLE TRIGGER { trigger_name | ALL | USER }

      启用指定触发器。trigger_name表示启用指定的单个触发器,ALL表示启用所有触发器,USER表示仅启用用户触发器。

    • ENABLE REPLICA TRIGGER trigger_name

      触发器的触发机制受GUC配置参数session_replication_role的影响。在会话处于“replica”模式时,仅会触发配置为ENABLE REPLICA的触发器;在会话处于“origin”(默认值)或“local”模式时,仅会触发没有配置ENABLE REPLICA的触发器。

    • ENABLE ALWAYS TRIGGER trigger_name

      指定为ENABLE ALWAYS TRIGGER的触发器,将不受当前复制模式session_replication_role的设置始终都会触发。

    • { DISABLE | ENABLE } [ REPLICA | ALWAYS ] RULE

      关闭或启动指定规则。

      • DISABLE [ REPLICA | ALWAYS ] RULE:关闭指定规则。
      • ENABLE REPLICA:表示仅在会话处于replica模式时启动。
      • ENABLE ALWAYS:指定为ENABLE ALWAYS TRIGGER的触发器,将不受当前复制模式session_replication_role的设置始终都会触发。

      由于涉及到视图的实现,ON SELECT规则不可禁用。配置属于表的重写规则时,已禁用的规则在系统中是可见的,仅在查询重写期间被禁用。规则触发机制同时受配置变量session_replication_role的影响。

    • { DISABLE | ENABLE } ROW LEVEL SECURITY

      开启或关闭表的行访问控制开关,相关开关状态会同步更新到各执行节点的 PG_CLASS.RELOPTIONS 中,以保持系统表元数据一致。

      当开启行访问控制开关时,如果未在该数据表中定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息请参见CREATE ROW LEVEL SECURITY POLICY。

    • {NO FORCE|FORCE} ROW LEVEL SECURITY

      强制开启或关闭表的行访问控制开关,相关开关状态会同步更新到各执行节点的 PG_CLASS.RELOPTIONS 中,以保持系统表元数据一致。

      默认情况,表所有者不受行访问控制特性影响,但当强制开启表的行访问控制开关时,表的所有者(不包含系统管理员用户)将受到行访问控制特性影响,系统管理员不受行访问控制策略影响。

    • ENCRYPTION KEY ROTATION

      透明数据加密密钥轮转。

      • 仅当数据库开启透明加密功能且表的enable_tde选项为on时,才可以进行表的数据加密密钥轮转操作。
      • 执行透明数据加密密钥轮转操作后,系统会自动向KMS申请创建新的密钥,使用旧密钥加密的数据仍使用旧密钥进行解密,新写入的数据需使用新密钥进行解密。为保证加密数据安全,用户可根据加密表的新增数据量大小定期更新密钥。
    • REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }

      在逻辑复制场景下,指定该表的UPDATE和DELETE操作中旧元组的记录级别。

      • DEFAULT:记录主键的列的旧值,没有主键则不记录。
      • USING INDEX:记录index_name覆盖的列(指定为NOT NULL的列)的旧值,仅记录唯一、全局以及最终的值。
      • FULL:记录该行中所有列的旧值。
      • NOTHING:不记录有关旧行的信息。

      在逻辑复制场景,解析该表的UPDATE和DELETE操作语句时,记录的信息组成解析出的旧元组。对于有主键表,该选项可设置为DEFAULT或FULL。对于无主键表,该选项需设置为FULL,否则解码时旧元组将解析为空。一般场景不建议设置为NOTHING,旧元组会始终解析为空,建议用户表定义主键或唯一约束,以保证回放的确定性,否则回放SQL语句时可能会导致多行修改影响数据正确性。针对Ustore表,设置为NOTHING时不生效,实际效果与设置为FULL行为一致;对于无主键表,设置为DEFAULT,记录该行所有列。

    • AUTO_INCREMENT [ = ] value

      设置自动增长列下一次的自增值。

      • 该语法仅在参数sql_compatibility='MYSQL'时生效。
      • 设置的值value仅在大于当前自增计数器时才会生效,且设置的值value必须是小于2127-1的非负数。
    • [ [ DEFAULT ] CHARACTER SET | CHARSET [ = ] default_charset ] [ [ DEFAULT ] COLLATE [ = ] default_collation ]

      将表的字符集和字符序修改为默认字符集和默认字符序。修改不会影响表中当前已经存在的列。

    • ILM ADD POLICY ROW STORE COMPRESS ADVANCED [ MEDIUM | HIGH ] ROW AFTER n { day | days | month | months | year | years } OF NO MODIFICATION [ ON ( EXPR )]

      在表上追加指定的ILM策略。一个完整的ILM策略由ILM动作和ILM条件构成。ILM动作表示用于定义具体的数据压缩或移动行为,ILM条件表示用于定义触发ILM动作的数据压缩或移动行为。ILM条件为行级条件,即ILM条件作用于表中的每一行。EXPR仅支持表字段及白名单中列出的函数具体请参见行表达式函数白名单。在闪回点与当前点之间添加ILM策略,不影响闪回功能。

    • [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE | DISABLE | DELETE } POLICY policy_name

      修改表(分区或子分区)的单个ILM策略。policy_name为系统视图GS_ADM_ILMOBJECTS或GS_MY_ILMOBJECTS查询得到的POLICY_NAME信息。

    • [ MODIFY { PARTITION partition_name | SUBPARTITION subpartition_name }] ILM { ENABLE_ALL | DISABLE_ALL | DELETE_ALL}

      修改表(分区或子分区)的所有ILM策略。

    • 其中列操作column_clause为:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET charset ] [ COLLATE collation ] [ column_constraint [ ... ] ]
      | MODIFY column_name data_type
      | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ]
      | MODIFY column_name [ CONSTRAINT constraint_name ] NULL
      | MODIFY column_name data_type { { [ COMMENT 'string' ] [ ... ] }
      | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
      | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) ] [ COLLATE collation ] [ USING expression ]
      | ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT }
      | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
      | ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer
      | ADD STATISTICS (( column_1_name, column_2_name [, ...] ))
      | DELETE STATISTICS (( column_1_name, column_2_name [, ...] ))
      | DISABLE STATISTICS (( column_1_name, column_2_name [, ...] ))
      | ENABLE STATISTICS (( column_1_name, column_2_name [, ...] ))
      | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] )
      | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
      | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
      
      • ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ CHARACTER SET | CHARSET [ = ] charset ] [ COLLATE collation ] [ column_constraint [ ... ] ]

        向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。如果指定IF NOT EXISTS关键字,如果存在相同名称的列,返回NOTICE提示,告知列已存在。未指定IF NOT EXISTS关键字时,如果存在相同名称的列,返回ERROR报错。

      • ADD ( { column_name data_type } [, ...] )

        向表中增加多列。

      • MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] )

        修改表已存在字段的数据类型。此命令会导致该字段的统计信息清空,建议在修改后重新收集该列的统计信息。

      • MODIFY column_name data_type { { [ COMMENT 'string' ] [ ... ] }
        • 修改表格已存在字段的定义,用新的定义替换字段的原定义,原字段上的索引、独立对象约束(例如:主键、唯一键、CHECK约束等)不会被删除。
        • 此语法只能在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')使用。
        • 此语法不支持外表、修改加密字段。
        • 不支持修改分区键字段的数据类型和排序规则,不支持修改规则引用的字段的数据类型和排序规则,不支持修改物化视图引用的字段的数据类型和排序规则。
        • 被修改数据类型或排序规则的字段如果被一个生成列引用,那么这个生成列的数据将会重新生成。
        • 被修改字段若被一些对象依赖(如:索引、独立对象约束、视图、触发器、行级访问控制策略等),修改字段过程中将会重建这些对象。若被修改后字段定义违反此类对象的约束,修改操作会失败,如:修改作为视图结果列的字段的数据类型。请修改字段前评估这类影响。
        • HASH、LIST、RANGE分布场景下不支持修改分布列数据类型和其注释。
        • 被修改字段若被一些对象调用(如:自定义函数、存储过程等),修改字段不会处理这些对象。修改字段后,这些对象有可能出现不可用的情况,请修改字段前评估这类影响。
        • 此子句与上一子句中“MODIFY column_name data_type”部分语法相同,语义功能不同,当GUC参数b_format_behavior_compat_options含有‘enable_modify_column’选项时,将按照此子句功能处理。
        • 此命令会导致该字段的统计信息清空,建议在修改后重新收集该列的统计信息。
      • DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]

        从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图等。

        DROP COLUMN命令并不是物理上把字段删除,而只是简单地把它标记为对SQL操作不可见。随后对该表的插入和更新将在该字段存储一个NULL。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将在执行VACUUM时而得到回收。

      • ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) ] [ COLLATE collation ] [ USING expression ]

        改变表字段的数据类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。

        当字段的原始数据类型和修改后的数据类型二进制兼容时,执行该语句不需要对整表进行重写,其他场景下会进行整表重写。原类型和目标类型是否二进制兼容可以在PG_CAST系统表中查看,如果castmethod为‘b’则二进制兼容。例如源表中数据类型是text类型,如果转为int类型则会触发表重写,转为clob类型则不会触发表重写。如果表重写被触发,该表上被删除的空间也将被立刻回收。

        此命令会导致该字段的统计信息清空,建议在修改后重新收集该列的统计信息。

        不支持修改加密字段。

      • ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT }

        为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的INSERT命令,它们不会修改表中已经存在的行。也可以为视图创建缺省,这个时候它们是在视图的ON INSERT规则应用之前插入到INSERT句中的。

      • ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL

        修改一个字段是否允许NULL值或者拒绝NULL值。如果表在字段中包含非NULL,则只能使用SET NOT NULL。

      • ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer

        为随后的ANALYZE操作设置针对每个字段的统计收集目标。目标的范围可以在0到10000之内设置。设置为-1时表示重新恢复到使用系统缺省的统计目标。

      • {ADD | DELETE} STATISTICS ((column_1_name, column_2_name [, ...]))

        用于添加和删除多列统计信息声明(不实际进行多列统计信息收集),以便在后续进行全表或全库analyze时进行多列统计信息收集。每组多列统计信息最多支持32列。不支持添加/删除多列统计信息声明的表:系统表、外表。

      • {DISABLE | ENABLE} STATISTICS ((column_1_name, column_2_name [, ...]))

        用于设置多列统计信息的状态。如果多列统计信息被禁用,则相关的统计信息不被收集,优化器在生成计划的阶段也不使用该多列统计信息。

      • ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] )

        ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )

        设置/重置属性选项。

        目前,属性选项只定义了n_distinct和n_distinct_inherited。n_distinct影响表本身的统计值,而n_distinct_inherited影响表及其继承子表的统计。目前,只支持SET/RESET n_distinct参数,禁止SET/RESET n_distinct_inherited参数。

      • ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }

        为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。

      • 其中列约束column_constraint为:
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
        14
        15
        16
        [ CONSTRAINT constraint_name ]
            { NOT NULL |
              NULL |
              CHECK ( expression ) |
              DEFAULT default_expr |
              ON UPDATE update_expr |
              AUTO_INCREMENT |
              COMMENT 'string' |
              COLVIEW |
              NOCOLVIEW |
              UNIQUE [KEY] index_parameters |
              PRIMARY KEY index_parameters |
              ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) |
              REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
                [ ON DELETE action ] [ ON UPDATE action ] }
            [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
        
        • 其中索引参数index_parameters为:
          1
          2
          [ WITH ( {storage_parameter = value} [, ... ] ) ]
              [ USING INDEX TABLESPACE tablespace_name ]
          
        • 其中update_expr为:
          { CURRENT_TIMESTAMP | LOCALTIMESTAMP | NOW() }
    • 其中根据已有唯一索引为表增加主键约束或唯一约束table_constraint_using_index为:
      1
      2
      3
      [ CONSTRAINT constraint_name ]
          { UNIQUE | PRIMARY KEY } USING INDEX index_name
          [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
      
    • 其中表约束table_constraint为:
      1
      2
      3
      4
      5
      6
      7
      [ CONSTRAINT [ constraint_name ] ]
          { CHECK ( expression ) |
            UNIQUE [ idx_name ] [ USING method ] ( { { column_name [ ( length ) ] | ( expression ) } [ ASC | DESC ] } [, ... ] ) index_parameters |
            PRIMARY KEY [ USING method ] ( { column_name [ ASC | DESC ] } [, ... ] ) index_parameters |
            FOREIGN KEY [ idx_name ] ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] }
          [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
          { [ COMMENT 'string' ] [ ... ] }
      
      其中索引参数index_parameters为:
      1
      2
      [ WITH ( {storage_parameter = value} [, ... ] ) ]
          [ USING INDEX TABLESPACE tablespace_name ][BY GLOBAL INDEX]
      

      当index_parameters指定BY GLOBAL INDEX时,将使用全局二级索引建立约束。

  • 重命名表。对名称的修改不会影响所存储的数据。
    1
    2
    ALTER TABLE [ IF EXISTS ] table_name
        RENAME [ TO | AS | = ] new_table_name;
    

    在MYSQL模式库中的5.7版本下指定(即sql_compatibility = 'MYSQL'、b_format_version='5.7'、b_format_dev_version='s2'),会出现以下特殊现象:

    • 新表名对应字符串的开头为"#mysql50#",且其后还有其他字符,"#mysql50#"将被忽略。
    • 如果新旧表名一致,不会报错。
  • 重命名表中指定的列。
    1
    2
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) }
        RENAME [ COLUMN ] column_name TO new_column_name;
    
  • 重命名表的约束。
    1
    2
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) }
        RENAME CONSTRAINT constraint_name TO new_constraint_name;
    
  • 设置表的所属模式。
    1
    2
    ALTER TABLE [ IF EXISTS ] table_name
        SET SCHEMA new_schema;
    
    • 这种形式把表移动到另外一个模式。相关的索引、约束都跟着移动。目前序列不支持改变schema。 若该表拥有序列,需要将序列删除,重建,或者取消拥有关系, 才能将表schema更改成功。
    • 要修改一个表的模式,用户必须在新模式上拥有CREATE权限。要把该表添加为一个父表的新子表,用户必须同时又是父表的所有者。要修改所有者,用户还必须是新的所有角色的直接或间接成员,并且该成员必须在该表的模式上有CREATE权限。这些限制规定了该用户不能做出了重建和删除表之外的事情。系统管理员可以以任何方式修改任意表的所有权限。
    • 除了RENAME和SET SCHEMA之外所有动作都可以捆绑在一个经过多次修改的列表中并行使用。比如,可以在一个命令里增加几个字段或修改几个字段的类型。对于大表,此种操作带来的效率提升更明显,原因在于只需要对该大表做一次处理。
    • 增加一个CHECK或NOT NULL约束将会扫描该表,以保证现有的行符合约束要求。
    • 用一个非空缺省值增加一个字段或者改变一个字段的现有类型会重写整个表。对于大表来说,这个操作可能会花很长时间,并且它还临时需要两倍的磁盘空间。
  • 更新多个列。
    1
    2
    ALTER TABLE [ IF EXISTS ] table_name
        MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] );
    
  • 等待执行该SQL时刻,表上所有的DML事务提交。
    1
    ALTER TABLE [ IF EXISTS ] table_name GSIWAITALL IN lock_mode MODE;
    

    此语法主要用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,同步全局二级索引在线创建过程中的锁等待,按给出的锁级别,在各节点获取与该锁级别互斥的事务列表,并等待这些事务结束。用户不建议使用。如使用,会返回错误提示信息。

参数说明

  • ONLINE | OFFLINE

    该关键字用于控制是否开启在线DDL。

    用ONLINE | OFFLINE关键字:
    • ONLINE:DDL以在线方式执行。此时,若ALTER TABLE语句中包含当前DDL特性不支持的场景时,DDL以离线方式执行,并通过NOTICE提示忽略ONLINE关键字。
    • OFFLINE:DDL以离线方式执行。
      • 在线DDL修改列类型、精度、长度或在线添加非空、检查、主键、唯一约束时,会检查数据是否满足数据类型转换、长度修改或约束条件。若检查结果为不满足,DDL操作则会报错。在线DDL可并发DML,可能会出现并发DML将不满足转换或违反约束的数据删除,但DDL仍然报错的情况。

        例如:在线DDL扫描表修改列类型时,若表上元组A的数据并不满足数据转换,在线DDL的事务扫描到元组A时,会立即报错。如果在同一时间使用并行事务DELETE把元组A删除,但在线DDL扫描检查的事务早于并行事务DELETE,因此不会认为元组A已被删除。

      • 在线DDL错误故障处理:包含在线DDL修改列类型、精度、长度或在线添加非空、检查、主键、唯一约束时,系统会自动创建临时模式作为DDL实现工具并将表设置为追加(append_mode)状态。若在线DDL正常执行完成,则临时模式会自动清理和恢复。自动清理过程可能由于等锁超时等原因而失败,无法进行自动清理,需要手动清理恢复。若发生严重故障,如FATAL、PANIC、数据库故障和节点断连等故障时,创建的临时模式和表的追加状态可能残留,需要手动清理和恢复。包含如下情况:
        • 取消执行在线DDL:执行过程中取消在线DDL,系统会自动清理。用户取消执行后首先进入残留清理流程,此时如果用户再次取消,则会结束清理流程导致残留。
        • 操作报错:当DDL命令执行过程中出现需要报错场景,如类型转换无法执行或长度修改损伤数据等,系统会报错并自动清理。
        • 严重故障:
          1. 分布式一主无备部署节点宕机:分布式一主无备节点,CN或DN节点宕机,可通过online_ddl_cleanup()进行手动清理,或在下次执行在线DDL或在线VACUUM FULL时自动清理。
          2. 分布式一主多备部署节点宕机:
            • 执行DDL的CN节点断连宕机:可通过online_ddl_cleanup()进行手动清理,或在下次执行在线DDL或在线VACUUM FULL时自动清理。
            • 其他节点断连宕机等故障:分布式一主多备节点且具有HA主备切换时,非执行DDL的CN节点故障,等待集群完成主备切换集群恢复正常(在线DDL会等待60s),最多重试次数为3次,若三次内集群恢复正常则无需手动清理,若集群恢复失败则需用户待集群正常后通过online_ddl_cleanup()进行手动清理。根据集群异常场景可能存在重试无法进行的场景,需手动清理。
        • 对于在线添加主键和唯一约束:若在线创建索引期间发生异常情况(比如用户手动取消、唯一索引键值重复、资源不足、启动线程失败、锁超时等失败场景)导致在线创建索引失败。这种情况下可能会残留索引以及临时表,占用系统资源,具体请参见CREATE INDEX章节中CONCURRENTLY对异常情况处理。
      • 不建议在线DDL执行中online_ddl_cleanup()清理操作,可能会导致中止在线DDL或产生未知错误。
      • 在线修改列类型char类型扩展时,不会修改重写底层数据。在线DDL操作后,已有的数据底层存储仍保有旧的长度,DML带来的新增修改数据的底层存储则会服从扩展长度。
  • online_parameter

    当指定ONLINE关键字时,用于指定在线DDL选项。若未指定ONLINE关键字或不满足在线DDL的条件,该参数不生效。

    取值范围:
    • parallel_threads:表示开启并行时的线程数。1-32之间的整数值,缺省时默认值为1。
      • 当parallel_threads设置为大于1时,开启多线程,采用线程数为指定线程数。
      • 当不设置parallel_threads或设置1,关闭多线程加速。

        当用户开启资源负载管理时,比如启用IO资源管理 (如io_limits>0或io_priority = high/medium/low),parallel_threads将忽略用户/会话下的资源负载管理,并给出提示当前资源负载管理无效并开启多线程加速。在线DDL多线程执行过程实际遵循初始用户的资源负载管理。

      • 其中关于索引并行parallel_workers参数共同作用加速。parallel_workers参数控制(最大)索引内并行线程数,parallel_threads参数控制(最大)索引间并行数。
    • max_catchup_times:表示在线DDL的最大追增轮次,防止在线DDL执行时间过长。1 - INT_MAX之间的整数值,缺省时默认值为50。
      • 在线DDL会记录数据重建过程中的DML增量数据到临时表,并采用多轮次循环追增,将增量数据进行重建。为防止由于DML并发数据量过大,在线DDL无法完成追增的情况,用户可以设置该参数,以限制追增次数。
    • last_catchup_threshold:触发最后一轮追增的时间上限。当一轮追增完成后,若该轮耗时低于此阈值,则触发最后一轮追增及切换。取值范围:[1000,1200000](单位:毫秒),默认值:5000。
    • online_ddl_lockwait_timeout:在线DDL的等锁超时时间。若等锁线程在该时间内未能获取锁,则报锁超时失败。触发CANCEL模式获取锁时,实际使用的超时时间为该参数值的2倍。取值范围:[1,1200000](单位:毫秒),默认值:10000。
    • lockwait_interval:等锁步长,即连续等锁超时的重试间隔。若当前轮次等锁超时,等待该参数指定的时长后进入下一轮尝试。取值范围:[0,300](单位:秒),默认值:5。
    • trylock_threshold:等锁尝试次数上限,需与enable_cancel配合使用。达到该上限后若仍因等锁超时而无法获取锁,则下一次尝试将采用CANCEL模式。若未开启enable_cancel,达到上限后取锁失败并报错。取值范围:[1,INT_MAX],或 -1(表示无上限),默认值:-1。
    • enable_cancel:是否允许用户业务快速失败,即在达到等锁尝试次数上限,或在切表事务获取用户表8级锁时,通过快速中止用户业务来确保在线DDL成功获取锁。取值范围:[false,true],默认值:false。
  • IF EXISTS

    如果不存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表不存在。

  • table_name [*] | ONLY table_name | ONLY ( table_name )

    table_name是需要修改的表名。

    若声明了ONLY选项,则只有该表被更改。若未声明ONLY,该表及其所有子表都将会被更改。另外,可以在表名称后面显式地增加*选项来指定包括子表,即表示所有后代表都被扫描,这是默认行为。

  • constraint_name
    • 在DROP CONSTRAINT操作中表示要删除的现有约束的名称。
    • 在ADD CONSTRAINT操作中表示新增的约束名称。

      对于新增约束,在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')constraint_name为可选项,在其他模式数据库下,必须加上constraint_name。

  • index_name

    索引名称。

    在ADD CONSTRAINT操作中:

    • index_name仅在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持,其他模式数据库下不支持。
    • 对于外键约束,constraint_name和index_name同时指定时,索引名为constraint_name。
    • 对于唯一键约束,constraint_name和index_name同时指定时,索引名为index_name。
  • USING method

    指定创建索引的方法。

    取值范围请参见CREATE INDEX章节中的USING method。

    在ADD CONSTRAINT操作中:

    • USING method仅在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持,其他模式数据库下不支持。
    • 在MYSQL模式下,未指定USING method时,对于ASTORE的存储方式,默认索引方法为btree;对于USTORE的存储方式,默认索引方法为ubtree。
    • 当表的存储方式为USTORE时,SQL语句中约束指定为using btree,底层会自动将约束建立为using ubtree。
  • ASC | DESC

    ASC表示指定按升序排序(默认)。DESC指定按降序排序。

    在ADD CONSTRAINT中,ASC | DESC只在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持,其他模式数据库不支持。

  • expression

    创建一个基于该表的一个或多个字段的表达式索引约束,必须写在圆括号中。

    UNIQUE约束中的表达式索引只在MYSQL模式数据库下支持(即sql_compatibility = 'MYSQL'),其他模式数据库不支持。

  • storage_parameter

    表的存储参数的名称。

    在线扩容新增的选项:

    • append_mode(枚举类型)

      设置表上扩容方式为在线扩容,离线扩容,非扩容方式。在线扩容时允许对表进行部分的修改操作;离线扩容时,在扩容时不允许对表进行操作。

      正在扩容的表上需要新增数据,要以追加的方式写入,便于记录增量数据。

      • on:标记表为在线扩容模式,在线扩容时,设置后后续数据以追加方式写入。
      • off:关闭扩容模式,设置后表上数据按正常方式写入,并且在pg_class.reloptions中不显示在线扩容相关的选项。
      • read_only:标记表为离线扩容。离线扩容时,不允许对表进行操作。
      • end_catchup:最后一轮追增的写报错模式,写业务报错,读业务正常执行。
    • rel_cn_oid(OID类型)

      记录当前CN节点中表的OID,用于在DN节点上生成delete_delta表。

      当append_mode=on时,必须同时指定rel_cn_oid。

      这append_mode,rel_cn_oid两个选项只在在线扩容工具中使用,不建议用户使用。

    • exec_step(整型)

      记录断点续传的步骤,记录在临时表的relOptions中。

      取值范围:[1,4]

      只支持数据重分布工具使用。

    • create_time(长整型)

      记录断点续传时临时表创建时间,记录在临时表的relOptions中。

      只支持数据重分布工具使用。

    • redistribute_version(长整型)

      标记逻辑扩容重分布某张表的重分布成功次数,提供给备机读校验一致性使用,每次该表重分布完成后值加1。

      此选项只在扩容流程设置,不建议用户使用。

    • enable_update_distkey

      标记该表是否支持更新(UPDATE)分布列的操作。仅当表的该属性设置为on,且在约束条件下时,才支持更新(UPDATE)分布列的操作。否则,分布列不支持更新(UPDATE)操作。

      取值范围:on/off

      默认值:off

      支持更新(UPDATE)分布列操作的约束如下:

      • 仅当相应表属性enable_update_distkey设置为on时才支持更新分布列。
      • 不支持将UPDATE语句下推DN执行,直接生成PGXC计划,不会根据更新分布列前后值而对计划做改变。
      • 不支持带有行级UPDATE TRIGGER的表,否则会执行失败,报错进行提示。对行级INSERT/DELETE TRIGGER不生效,update statement级TRIGGER正常执行。
      • 不支持并发更新同一行,先获取锁的执行,DN上后获取锁的按照GUC参数concurrent_dml_mode设置情况进行不同的行为(返回0或报错)。如果报错,则可能存在两种情况:(1)报错提示信息为update distribute column conflict。(2)当获取锁时间超过阈值时,报错提示信息为锁超时。
      • 不支持带有全局二级索引(GSI)的表,否则会执行报错。
      • 只支持HASH分布,不支持LIST/RANGE分布表,否则会执行报错。
      • 不支持MERGE INTO和UPSERT更新分布列的行为,否则会执行报错。
      • 不支持gtm_free,否则会执行报错。
      • 不支持UPDATE RETURNING,否则会执行报错。
      • 不支持带有关联表的语句,否则会执行报错。
      • 不支持UPDATE + LIMIT,否则会执行报错。

    创建索引新增一个选项:

    • parallel_workers(int类型)

      表示创建索引时起的bgworker线程数量,例如2就表示将会起2个bgworker线程并发创建索引。

      取值范围:[0,32],0表示关闭并行建索引。

      默认值:不设置该参数,表示未开启并行建索引功能。

    复制表新增选项:
    • primarynode(bool类型)

      默认值:off

      当primarynode=on时,将为复制表选择primary node,通常是pgxc_class表nodeoids字段记录的第一个节点。当复制表执行IUD操作时,将先下发到primarynode节点执行,收到结果后再下发到其它DN。

    • logical_repl_node(字符串类型)

      分布式复制表逻辑解码时,向CN返回逻辑日志的DN节点名。对于复制表,如用户不指定,则默认为当前表所在node group的第一个节点。对该选项进行RESET操作时,会重置为当前表的第一个节点。

      取值范围:字符串。

      默认值:非复制表默认为空,复制表默认为第一个节点名。

    透明数据加密选项:

    • enable_tde(bool类型)

      是否将表设置为加密表。本参数仅支持行存表、段页式表、hashbucket表、临时表和unlogged表。设置enable_tde=on时,请确保已通过GUC参数enable_tde开启透明加密功能,并通过GUC参数tde_key_info设置访问密钥服务的信息。在《开发指南》中“特性使用指导 > 透明数据加密”章节可获取该参数的详细使用方法。

      取值范围:on/off。

      on:表示开启透明数据加密。

      off:表示关闭透明数据加密。

      • 从on切换为off后,插入或更新数据在写入旧页面时仍加密,写入切换后新生成的页面时会不加密。
      • 从off切换为on后,插入或更新数据在写入旧页面时不加密,写入切换后新生成的页面时会自动加密。

      即:加密开关切换后,生成的新数据页面加密状态与开关切换后状态保持一致,旧数据页面加密状态与开关切换前状态保持一致。建议用户在切换加密开关后,手动对表执行VACUUM FULL操作,使所有数据页面加密状态保持一致。

      默认值:off

    • encrypt_algo(string类型)

      指定加密表的加密算法。

      取值范围:字符串,有效值为:AES_128_CTR,SM4_CTR、AES_128_CTR_SHA256_HMAC、SM4_CTR_SM3_HMAC或AES_128_GCM。

      默认值:如果enable_tde=on,GUC参数tde_encrypt_config中子参数table_algorithm不为空,默认值与table_algorithm相同;如果table_algorithm为空,默认值为AES_128_CTR。如果enable_tde=off,默认值为空。

      • 类似于enable_tde,切换encrypt_algo后,插入或更新数据在写入旧页面时仍使用旧加密算法,写入切换后新生成的页面时则使用新加密算法。
      • 同样可通过手动对表执行VACUUM FULL操作,使所有数据页面均使用新算法加密。
    • hasuids(bool类型)

      默认值:off

      参数开启:更新表元组时,为元组分配表级唯一标识id。

    • statistic_granularity

      记录该表在分析统计信息时的默认partition_mode。partition_mode说明请参见ANALYZE | ANALYSE章节中的PARTITION_MODE。此参数对非分区表设置无效。

      取值范围:请参见partition_mode取值范围。

      默认值:AUTO

    ROWID特性新增选项:
    • hasrowid

      指定表是否包含ROWID、ROWNO系统列。设置hasrowid = on时,该表会增加rowid系统列和rowno系统列,且会在rowno系统列上关联创建序列和索引。

      取值范围:on、off

      默认值:off

      • 此参数只支持ORA兼容模式数据库(即sql_compatibility = 'ORA')。
      • 此参数不支持本地临时表、Unlogged表、全局临时表、物化视图、hashbucket表、复制表。
      • 此参数不支持和hasuids参数同时指定。
      • 开启此参数时,不支持定义普通列名为rowno、rowid。
      • 不支持通过SET ( {storage_parameter = value} [, ... ] )或RESET ( storage_parameter [, ... ] )子句变更表的hasrowid存储选项为不同值。

    在线DDL新增的选项:

    • online_ddl_status(枚举类型)

      本参数用于更新目标表在线DDL执行状态。

      仅支持在线DDL内部调用,不建议用户使用。

      • on:开启在线DDL状态。
      • off:关闭在线DDL状态。
      • init:进行在线DDL临时对象初始化。
      • catchup:进行DDL操作的并发新增数据追增。
      • catchup_basedata: 进行在线ddl操作的基础数据同步。
      • scan_catchup:进行在线添加非空/检查约束操作的数据追增。
      • scan_catchup_basedata:进行在线添加非空/检查约束操作的基础数据检查。
      • vacuum_catchup:进行在线VACUUM FULL操作的数据追增。
      • vacuum_verbose_catchup:进行在线VACUUM FULL VERBOSE操作的数据追增。
      • last_catchup:进入在线DDL最后一轮追增的写报错模式。
      • switch:进行在线DDL最后一轮追增的临时表交换。
      • copy_switch:进行在线移动表空间操作最后一轮追增的临时表交换。
      • record_toast_oid:记录在线DDL操作目标表附带的TOAST表的OID。
      • abort:在线DDL进入abort状态。
      • flush_buffer:用于在线移动表空间操作中强制buffer落盘。
      • tmp_rel:用于标识该表为在线DDL过程创建的临时表。
    • online_ddl_lock_tag(int类型)

      用于记录在线DDL目标表的唯一标识(“表所在的Schema+表名”的hash值),用于生成临时对象。

      仅支持在线DDL内部调用,不建议用户使用。

    VACUUM新增的选项:

    • vacuum_truncate

      表示是否开启表的VACUUM TRUNCATE功能。

      取值范围:on/off

      默认值:on

  • new_owner

    表新拥有者的名称。

  • new_tablespace

    表所属新的表空间名称。

  • column_name,column_1_name, column_2_name

    现存的或新字段的名称。

  • data_type

    新字段的类型,或者现存字段的新类型。

  • charset

    指定表字段的字符集。单独指定时会将字段的字符序设置为指定的字符集的默认字符序。

    仅在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持该语法,其他模式数据库不支持。

  • collation

    字段排序规则(字符序)名称。可选字段COLLATE指定了新字段的排序规则,如果省略,排序规则为新字段的默认类型。排序规则可以使用“select * from pg_collation”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。

    对于MYSQL模式数据库下(即sql_compatibility = 'MYSQL')还支持utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci、binary、gbk_chinese_ci、gbk_bin、gb18030_chinese_ci、gb18030_bin字符序,部分说明请参见表1。

    • 仅字符类型支持指定字符集。指定为binary字符集或字符序实际是将字符类型转化为对应的二进制类型,若类型映射不存在则报错。当前仅有TEXT类型转化为BLOB的映射。
    • 除binary字符集和字符序外,当前仅支持指定与数据库编码相同的字符集。
    • 字段字符集或字符序未显式指定时,若指定了表的默认字符集或字符序,字段字符集和字符序将从表上继承。若表的默认字符集或字符序不存在,当b_format_behavior_compat_options包含‘default_collation’时,字段的字符集和字符序将继承当前数据库的字符集及其对应的默认字符序。
    • 当修改的字符集或字符序对应的字符集与当前字段字符集不同时,会将字段中的数据转换为指定的字符集进行编码。
  • USING expression

    USING子句声明如何从旧的字段值里计算新的字段值;如果省略,缺省从旧类型向新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换,则必须提供一个USING子句。

    ALTER TYPE的USING选项实际上可以声明涉及该行旧值的任何表达式,即它可以引用除了正在被转换的字段之外其他的字段。这样,就可以用ALTER TYPE语法做非常普遍性的转换。因为这个灵活性,USING表达式并没有作用于该字段的缺省值(如果有的话),结果可能不是缺省表达式要求的常量表达式。这就意味着如果从旧类型到新类型没有隐含或者赋值转换的话,即使存在USING子句,ALTER TYPE也可能无法把缺省值转换成新的类型。在这种情况下,应该用DROP DEFAULT先删除缺省,执行ALTER TYPE,然后使用SET DEFAULT增加一个合适的新缺省值。类似的考虑也适用于涉及该字段的索引和约束。

  • NOT NULL | NULL

    设置列是否允许空值。

  • ENABLE

    表示启动该约束,缺省时默认启用。

  • integer

    带符号的整数常值。当使用PERCENT时表示按照表数据的百分比收集统计信息,integer的取值范围为0-100。

  • attribute_option

    属性选项。

  • PLAIN | EXTERNAL | EXTENDED | MAIN

    字段存储模式。

    • PLAIN必须用于定长的数值(比如integer)并且是内联的、不压缩的。
    • MAIN用于内联、可压缩的数据。
    • EXTERNAL用于外部保存、不压缩的数据。使用EXTERNAL将令在text和bytea字段上的子字符串操作更快,但付出的代价是增加了存储空间。
    • EXTENDED用于外部的压缩数据,EXTENDED是大多数支持非PLAIN存储的数据的缺省。
  • CHECK ( expression )

    每次将要插入的新行或者将要被更新的行必须使表达式结果为真才能成功,否则会抛出一个异常并且不会修改数据库。

    声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。

    目前,CHECK表达式不能包含子查询也不能引用除当前行字段之外的变量。

  • DEFAULT default_expr

    给字段指定缺省值。

    缺省表达式的数据类型必须和字段类型匹配。

    缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。

  • ON UPDATE update_expr

    ON UPDATE子句为字段的一种属性约束。

    当对表中某元组执行UPDATE操作时,若更新字段的新值和表中旧值不相同,则表中该元组上具有该属性且不在更新字段内的字段值自动更新为当前时间戳;若更新字段的新值和表中旧值相同,则表中该元组上具有该属性且不在更新字段内的字段值不变,保持原有值;若具有该属性的字段在更新字段内,则对应这些字段值直接按指定更新的值更新。

    • 该属性支持在MYSQL模式数据库中的5.7版本下指定(即sql_compatibility = 'MYSQL'、b_format_version='5.7'、b_format_dev_version='s1')和PG模式数据库模式中指定(升级观察期间不支持该语法)。
    • 语法上update_expr支持CURRENT_TIMESTAMP、LOCALTIMESTAMP、NOW()三种关键字,也支持关键字带括号指定或不指定精度。三种关键字互为同义词,属性效果相同。例如:ON UPDATE CURRENT_TIMESTAMP()、ON UPDATE CURRENT_TIMESTAMP(5)、ON UPDATE LOCALTIMESTAMP()、ON UPDATE LOCALTIMESTAMP(6)等。不带括号或空括号时精度为0,其中NOW关键字不支持不带括号。PG兼容模式下不支持ON UPDATE CURRENT_TIMESTAMP()、ON UPDATE LOCALTIMESTAMP()和ON UPDATE NOW(5)。
    • 该属性仅支持在如下类型的列上指定:timestamp、datetime、date、time without time zone、smalldatetime、abstime。
    • CREATE TABLE AS语法不会继承该列属性。
    • CREATE TABLE LIKE语法可通过INCLUDING UPDATE或EXCLUDING UPDATE来选择继承或排除该约束,PG兼容模式下只支持EXCLUDING UPDATE选项排除该约束。新增INCLUDING ILM选项复制旧表的ilm策略信息,结合INCLUDING PARTITION选项使用可以复制旧表上分区对象的策略信息。
    • 该属性指定的精度和对应列上类型指定的精度可以不一致,通过该属性更新字段值后显示结果按最小精度显示。例如:ALTER TABLE t1 ADD col1 timestamp(6) ON UPDATE CURRENT_TIMESTAMP(3);若UPDATE语法触发该属性生效,则本次更新后col1字段值小数位显示3位。
    • 该属性和生成列约束不能同时指定同一列。
    • 分区表中的分区键不支持指定该属性。
    • 分布式场景中,分布列和主键不支持指定该属性。
  • AUTO_INCREMENT

    指定列为自动增长列。

    具体请参见CREATE TABLE章节中的AUTO_INCREMENT。

  • COLUMN_ENCRYPTION_KEY = column_encryption_key

    为ENCRYPTED WITH约束中列加密密钥的名称。

    取值范围:字符串,要符合标识符命名规范。

  • ENCRYPTION_TYPE = encryption_type_value

    为ENCRYPTED WITH约束中的加密类型,encryption_type_value的值为[ DETERMINISTIC | RANDOMIZED ]。

  • COMMENT [ = ] 'string'
    • COMMENT [ = ] 'string'子句表示给表添加注释。
    • 在column_constraint中的COMMENT 'string' 表示给列添加注释。
    • 在table_constraint中的COMMENT 'string' 表示给主键和唯一键对应的索引添加注释。

    具体请参见CREATE TABLE章节中的COMMENT [ = ] 'string'。

  • UNIQUE [KEY] index_parameters

    UNIQUE约束表示表里的一个或多个字段的组合必须在全表范围内唯一。

    对于唯一约束,NULL被认为是互不相等的。

    UNIQUE KEY只能在在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持使用,与UNIQUE语义相同。

  • UNIQUE [ index_name ][ USING method ] ( { {column_name [ ( length ) ] | ( expression ) } [ ASC | DESC ] }[, ... ] ) index_parameters

    UNIQUE约束表示表里的一个或多个字段的组合必须在全表范围内唯一。

    column_name (length)是前缀键,具体请参见CREATE INDEX章节中的column_name ( length )。

    对于唯一约束,NULL被认为是互不相等的。

    • index_name仅在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持,其他模式数据库下不支持。
    • 对于唯一键约束,constraint_name和index_name同时指定时,索引名为index_name。
  • PRIMARY KEY index_parameters

    PRIMARY KEY [ USING method ] ( { column_name [ ASC | DESC ] } [, ... ] ) index_parameters

    主键约束表明表中的一个或者一些字段只能包含唯一(不重复)的非NULL值。

  • USING method

    指定创建索引的方法。

    取值范围请参见CREATE INDEX中的参数说明。

    • USING method仅在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持,其他模式数据库下不支持。
    • 在MYSQL模式数据库下,未指定USING method时,对于ASTORE的存储方式,默认索引方法为btree;对于USTORE的存储方式,默认索引方法为ubtree。
    • 对于默认建立全局二级索引的约束,由于全局二级索引底层使用ubtree存储,即使用户指定存储方式为btree,底层也会建立为ubtree。
    • 当表的存储方式为USTORE时,SQL语句中约束指定为using btree,底层会自动将约束建立为using ubtree。
  • ASC | DESC

    ASC表示指定按升序排序(默认)。DESC指定按降序排序。

    ASC | DESC只在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持,其他模式数据库不支持。

  • expression

    创建一个基于该表的一个或多个字段的表达式索引约束,必须写在圆括号中。

    UNIQUE约束中的表达式索引只在MYSQL模式数据库下支持(即sql_compatibility = 'MYSQL'),其他模式数据库不支持。

  • DEFERRABLE | NOT DEFERRABLE

    这两个关键字用于设置约束是否可推迟。不可推迟的约束将在每条命令执行后立即检查。可推迟约束可以延迟到事务结尾通过SET CONSTRAINTS命令检查,缺省值为NOT DEFERRABLE。目前UNIQUE约束、主键约束、外键约束可以接受该子句,其他约束类型均不可推迟。

  • INITIALLY IMMEDIATE | INITIALLY DEFERRED

    若约束可推迟,该子句声明检查约束的缺省时间。不可推迟的约束始终为INITIALLY IMMEDIATE且不可声明为INITIALLY DEFERRED。

    • 如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行后立即检查。
    • 如果约束是INITIALLY DEFERRED ,则仅在事务结束时进行检查。
  • WITH ( {storage_parameter = value} [, ... ] )

    为表或索引指定一个可选的存储参数。

  • tablespace_name

    索引所在表空间的名称。

  • NOCOMPRESS

    如果指定关键字NOCOMPRESS则不会修改表的现有压缩特性。

  • new_table_name

    修改后新的表名称。

  • new_column_name

    表中指定列修改后新的列名称。

  • new_constraint_name

    修改后表约束的新名称。

  • new_schema

    修改后新的模式名称。

  • CASCADE

    级联删除依赖于被依赖字段或者约束的对象(比如引用该字段的视图)。

  • RESTRICT

    如果该列被其他字段或者约束引用,则拒绝删除该列。RESTRICT为CASCADE的缺省选项,如果未指定则为RESTRICT。语句示例如下:

    ALTER TABLE table_name [DROP [column] col_name [CASCADE | RESTRICT]];
    其中:table_name表示表名,col_name表示列名。
  • schema_name

    表所在的模式名称。

  • IF NOT EXISTS

    如果指定IF NOT EXISTS,如果存在相同名称的列,返回NOTICE提示,告知列已存在。未指定IF NOT EXISTS时,如果存在相同名称的列,返回ERROR报错。

  • [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset

    修改表的默认字符集。单独指定时会将表的默认字符序设置为指定的字符集的默认字符序。

  • [DEFAULT] COLLATE [ = ] default_collation

    修改表的默认字符序。单独指定时会将表的默认字符集设置为指定的字符序对应的字符集。

    仅在MYSQL模式数据库下(即sql_compatibility = 'MYSQL')支持该语法。字符序请参见表1。

    表的字符集或字符序未显式指定时,若指定了模式的默认字符集或字符序,表字符集和字符序将从模式上继承。若模式的默认字符集或字符序不存在,当b_format_behavior_compat_options包含‘default_collation’时,表的字符集和字符序将继承当前数据库的字符集及其对应的默认字符序。

  • GSIWAITALL

    用于CREATE GLOBAL INDEX CONCURRENTLY/REINDEX INDEX CONCURRENTLY功能内部调用,同步全局二级索引在线创建过程中的锁等待,按给出的锁级别,在各节点获取与该锁级别互斥的事务列表,并等待这些事务结束。

修改表示例

  • 重命名表。
    gaussdb=# CREATE TABLE aa(c1 int, c2 int);
    gaussdb=# ALTER TABLE IF EXISTS aa RENAME TO test_alt1;
  • 修改表所属模式。
    --创建模式test_schema。
    gaussdb=# CREATE SCHEMA test_schema;
    
    --把表test_alt1的所属模式修改为test_schema。
    gaussdb=# ALTER TABLE test_alt1 SET SCHEMA test_schema;
    
    --查询表信息。
    gaussdb=# SELECT schemaname,tablename FROM pg_tables WHERE tablename = 'test_alt1';
     schemaname  | tablename 
    -------------+-----------
     test_schema | test_alt1
    (1 row)
  • 修改表的所有者。
    --创建用户test_user。
    gaussdb=# CREATE USER test_user PASSWORD '********';
    
    --修改test_alt1表的所有者为test_user。
    gaussdb=# ALTER TABLE IF EXISTS test_schema.test_alt1 OWNER TO test_user;
    
    --查看。
    gaussdb=# SELECT tablename, schemaname, tableowner FROM pg_tables WHERE tablename = 'test_alt1';
     tablename | schemaname  | tableowner 
    -----------+-------------+------------
     test_alt1 | test_schema | test_user
    (1 row)
  • 修改表的表空间。
    --创建表空间tbs_data1。
    gaussdb=# CREATE TABLESPACE tbs_data1 RELATIVE LOCATION 'tablespace1/tbs_data1';
    
    --修改test_alt1表的空间为tbs_data1。
    gaussdb=# ALTER TABLE test_schema.test_alt1 SET TABLESPACE tbs_data1;
    
    --查看。
    gaussdb=# SELECT tablename, tablespace FROM pg_tables WHERE tablename = 'test_alt1';
     tablename | tablespace 
    -----------+------------
     test_alt1 | tbs_data1
    (1 row)
    
    --创建表
    gaussdb=# CREATE TABLE test(c1 int, c2 int);
    --在线修改test表的空间为tbs_data1。
    gaussdb=# ALTER TABLE ONLINE test SET TABLESPACE tbs_data1;
    
    --查看。
    gaussdb=# SELECT tablename, tablespace FROM pg_tables WHERE tablename = 'test';
     tablename | tablespace 
    -----------+------------
     test| tbs_data1
    (1 row)
    
    --删除。
    gaussdb=# DROP TABLE test ; 
    gaussdb=# DROP TABLE test_schema.test_alt1; 
    gaussdb=# DROP TABLESPACE tbs_data1; 
    gaussdb=# DROP SCHEMA test_schema; 
    gaussdb=# DROP USER test_user;

修改列示例

  • 修改列名。
    --建表。
    gaussdb=# CREATE TABLE test_alt2(c1 INT,c2 INT);
    
    --修改列名。
    gaussdb=# ALTER TABLE test_alt2 RENAME c1 TO id;
    gaussdb=# ALTER TABLE test_alt2 RENAME COLUMN c2 to areaid; 
    
    --查看。
    gaussdb=# \d test_alt2
       Table "public.test_alt2"
     Column |  Type   | Modifiers 
    --------+---------+-----------
     id     | integer | 
     areaid | integer | 
  • 增加列。
    --表test_alt2增加列。
    gaussdb=# ALTER TABLE IF EXISTS test_alt2 ADD COLUMN name VARCHAR(20);
    
    --查看。
    gaussdb=# \d test_alt2
               Table "public.test_alt2"
      Column  |         Type          | Modifiers 
    ----------+-----------------------+-----------
     id       | integer               | 
     areaid   | integer               | 
     name     | character varying(20) |
  • 增加自增列。
    --表local_autoinc增加AUTO_INCREMENT自增列(根据实际情况修改DATANODE名字,SELECT node_name FROM pgxc_node WHERE node_type = 'D';)。
    gaussdb=# CREATE TABLE local_autoinc(col1 int)
    DISTRIBUTE BY LIST(col1)(
        SLICE s1 VALUES (1) DATANODE datanode1,
        SLICE s2 VALUES (2) DATANODE datanode2
    );
    --数据分布到DN1上。
    gaussdb=# INSERT INTO local_autoinc(col1) VALUES(1);
    
    --添加一个本地自增列,每个DN从1开始自增。
    gaussdb=# ALTER TABLE local_autoinc ADD COLUMN col int AUTO_INCREMENT;
    gaussdb=# SELECT col,col1 FROM local_autoinc ORDER BY 2,1;
     col | col1
    -----+------
       1 |    1
    (1 row)
    
    --将所有DN的下一个自增值设为10。
    gaussdb=# ALTER TABLE local_autoinc AUTO_INCREMENT = 10;
    
    --数据分布到DN1上,NULL触发自增,自增值为10。
    gaussdb=# INSERT INTO local_autoinc(col, col1) VALUES(NULL,1);
    
    --数据分布到DN2上,0触发自增,自增值为10。
    gaussdb=# INSERT INTO local_autoinc(col, col1) VALUES(0,2);
    gaussdb=# SELECT col,col1 FROM local_autoinc ORDER BY 2,1;
     col | col1
    -----+------
       1 |    1
      10 |    1
      10 |    2
    (3 rows)
  • 修改列的数据类型。
    --修改test_alt2表中name字段的类型。
    gaussdb=# ALTER TABLE test_alt2 MODIFY name VARCHAR(50);
    
    
    --查看。
    gaussdb=# \d test_alt2
              Table "public.test_alt2"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     id     | integer               | 
     areaid | integer               | 
     name   | character varying(50) | 
    
    --在线修改test_alt2表中name字段的类型。
    gaussdb=# ALTER TABLE ONLINE test_alt2 MODIFY name VARCHAR(60);
    
    
    --查看。
    gaussdb=# \d test_alt2
              Table "public.test_alt2"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     id     | integer               | 
     areaid | integer               | 
     name   | character varying(60) | 
    --修改test_alt2表中name字段的类型。
    gaussdb=# ALTER TABLE test_alt2 ALTER COLUMN name TYPE VARCHAR(25);
    
    --查看。
    gaussdb=# \d test_alt2
              Table "public.test_alt2"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     id     | integer               | 
     areaid | integer               | 
     name   | character varying(25) | 
    
    --在线修改test_alt2表中name字段的类型。
    gaussdb=# ALTER TABLE ONLINE test_alt2 ALTER COLUMN name TYPE VARCHAR(35);
    
    --查看。
    gaussdb=# \d test_alt2
              Table "public.test_alt2"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     id     | integer               | 
     areaid | integer               | 
     name   | character varying(35) | 
  • 删除列。
    --删除test_alt2中areaid字段。
    gaussdb=# ALTER TABLE test_alt2 DROP COLUMN areaid;
    
    --查看。
    gaussdb=# \d test_alt2
              Table "public.test_alt2"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     id     | integer               | 
     name   | character varying(25) | 
  • 修改列的存储模式。
    --查看表详细信息。
    gaussdb=# \d+ test_alt2
                                  Table "public.test_alt2"
     Column |         Type          | Modifiers | Storage  | Stats target | Description 
    --------+-----------------------+-----------+----------+--------------+-------------
     id     | integer               |           | plain    |              | 
     name   | character varying(35) |           | extended |              | 
    Has OIDs: no
    Distribute By: HASH(id)
    Location Nodes: ALL DATANODES
    Options: orientation=row, compression=no, storage_type=USTORE, segment=off
    
    --修改test_alt2表中name字段的存储模式。
    gaussdb=# ALTER TABLE test_alt2 ALTER COLUMN name SET STORAGE PLAIN;
    
    --查看。
    gaussdb=# \d+ test_alt2
                                 Table "public.test_alt2"
     Column |         Type          | Modifiers | Storage | Stats target | Description 
    --------+-----------------------+-----------+---------+--------------+-------------
     id     | integer               |           | plain   |              | 
     name   | character varying(35) |           | plain   |              | 
    Has OIDs: no
    Distribute By: HASH(id)
    Location Nodes: ALL DATANODES
    Options: orientation=row, compression=no, storage_type=USTORE, segment=off
    
    
    --删除。
    gaussdb=# DROP TABLE test_alt2;

修改约束示例

  • 为列添加非空约束。
    --建表。
    gaussdb=# CREATE TABLE test_alt3(pid INT, areaid CHAR(5), name VARCHAR(20));
    
    --为pid添加非空约束。
    gaussdb=# ALTER TABLE test_alt3 MODIFY pid NOT NULL;
    
    --查看。
    gaussdb=# \d test_alt3
              Table "public.test_alt3"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     pid    | integer               | not null
     areaid | character(5)          | 
     name   | character varying(20) |
    
    --取消列的非空约束。
    gaussdb=# ALTER TABLE test_alt3 MODIFY pid NULL;
    
    --在线为pid添加非空约束。
    gaussdb=# ALTER TABLE ONLINE test_alt3 MODIFY pid NOT NULL;
    
    --查看。
    gaussdb=# \d test_alt3
              Table "public.test_alt3"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     pid    | integer               | not null
     areaid | character(5)          | 
     name   | character varying(20) |
  • 取消列的非空约束。
    gaussdb=# ALTER TABLE test_alt3 MODIFY pid NULL;
    --查看。
    gaussdb=# \d test_alt3
              Table "public.test_alt3"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     pid    | integer               | 
     areaid | character(5)          | 
     name   | character varying(20) | 
  • 修改字段默认值。
    --修改test_alt3表中id的默认值。
    gaussdb=# ALTER TABLE test_alt3 ALTER COLUMN areaid SET DEFAULT '00000';
    
    --查看。
    gaussdb=# \d test_alt3
                     Table "public.test_alt3"
     Column |         Type          |        Modifiers        
    --------+-----------------------+-------------------------
     pid    | integer               | 
     areaid | character(5)          | default '00000'::bpchar
     name   | character varying(20) |
    --删除id的默认值。
    gaussdb=# ALTER TABLE test_alt3 ALTER COLUMN areaid DROP DEFAULT;
    
    --查看。
    gaussdb=# \d test_alt3
              Table "public.test_alt3"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     pid    | integer               | 
     areaid | character(5)          | 
     name   | character varying(20) |
  • 添加表级约束。
    • 直接添加约束。
      --给表添加主键约束。
      gaussdb=# ALTER TABLE test_alt3 ADD CONSTRAINT pk_test3_pid PRIMARY KEY (pid);
      
      --查看。
      gaussdb=# \d test_alt3
                Table "public.test_alt3"
       Column |         Type          | Modifiers 
      --------+-----------------------+-----------
       pid    | integer               | not null
       areaid | character(5)          | 
       name   | character varying(20) | 
      Indexes:
          "pk_test3_pid" PRIMARY KEY, ubtree (pid) WITH (storage_type=USTORE) TABLESPACE pg_default
      
      --删除表
      gaussdb=# DROP TABLE IF EXISTS test_alt3;
      
      --建表。
      gaussdb=# CREATE TABLE test_alt3(pid INT, areaid CHAR(5), name VARCHAR(20));
      
      --在线给表添加主键约束。
      gaussdb=# ALTER TABLE ONLINE test_alt3 ADD CONSTRAINT pk_test3_pid PRIMARY KEY (pid);
      
      --查看。
      gaussdb=# \d test_alt3
                Table "public.test_alt3"
       Column |         Type          | Modifiers 
      --------+-----------------------+-----------
       pid    | integer               | not null
       areaid | character(5)          | 
       name   | character varying(20) | 
      Indexes:
          "pk_test3_pid" PRIMARY KEY, ubtree (pid) WITH (storage_type=USTORE) TABLESPACE pg_default
    • 先创建索引然后再添加约束。
      --建表。
      gaussdb=# CREATE TABLE test_alt4(c1 INT, c2 INT);
      
      --建索引。
      gaussdb=# CREATE UNIQUE INDEX pk_test4_c1 ON test_alt4(c1);
      
      --添加约束时关联已经创建的索引。
      gaussdb=# ALTER TABLE test_alt4 ADD CONSTRAINT pk_test4_c1 PRIMARY KEY USING INDEX pk_test4_c1;
      
      --查看。
      gaussdb=# \d test_alt4
         Table "public.test_alt4"
       Column |  Type   | Modifiers 
      --------+---------+-----------
       c1     | integer | not null
       c2     | integer | 
      Indexes:
          "pk_test4_c1" PRIMARY KEY, ubtree (c1) WITH (storage_type=USTORE) TABLESPACE pg_default
      
      --删除。
      gaussdb=# DROP TABLE test_alt4;
  • 删除表级约束。
    --删除约束。
    gaussdb=# ALTER TABLE test_alt3 DROP CONSTRAINT IF EXISTS pk_test3_pid;
    
    --查看。
    gaussdb=# \d test_alt3
              Table "public.test_alt3"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     pid    | integer               | not null
     areaid | character(5)          | 
     name   | character varying(20) | 
    
    --删除。
    gaussdb=# DROP TABLE test_alt3;
    
    --删除主键约束(该语法仅在MYSQL兼容模式以及ORA兼容模式下支持使用)。
    gaussdb=# CREATE TABLE test_drop_primary_key(c1 INT PRIMARY KEY);
    gaussdb=# \d test_drop_primary_key
    Table "public.test_drop_primary_key"
     Column |  Type   | Modifiers 
    --------+---------+-----------
     c1     | integer | not null
    Indexes:
        "test_drop_primary_key_pkey" PRIMARY KEY, ubtree (c1) WITH (storage_type=USTORE) TABLESPACE pg_default
    
    
    gaussdb=# ALTER TABLE test_drop_primary_key DROP PRIMARY KEY;
    gaussdb=# \d test_drop_primary_key
    Table "public.test_drop_primary_key"
     Column |  Type   | Modifiers 
    --------+---------+-----------
     c1     | integer | not null
  • 重命名约束。
    --创建表tbl_test1,指定主键约束。
    gaussdb=# CREATE TABLE tbl_test1(
        id int,
        name varchar(50),
        CONSTRAINT aaa PRIMARY KEY (id)
    );
    
    --重命名约束。
    gaussdb=# ALTER TABLE tbl_test1 RENAME CONSTRAINT aaa TO pk_test1_id;
    
    --查看信息。
    gaussdb=# \d tbl_test1;
              Table "public.tbl_test1"
     Column |         Type          | Modifiers 
    --------+-----------------------+-----------
     id     | integer               | not null
     name   | character varying(50) | 
    Indexes:
        "pk_test1_id" PRIMARY KEY, ubtree (id) WITH (storage_type=USTORE) TABLESPACE pg_default
    
    
    --删除表。
    gaussdb=# DROP TABLE tbl_test1;

相关链接

CREATE TABLE,DROP TABLE

相关文档