数据仓库服务 GAUSSDB(DWS)-ALTER TABLE:语法格式

时间:2024-05-21 17:09:43

语法格式

  • 修改表的定义。
    1
    2
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) }
        action [, ... ];
    
    其中具体表操作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
    column_clause
        | ADD table_constraint [ NOT VALID ]
        | ADD table_constraint_using_index
        | VALIDATE CONSTRAINT constraint_name
        | DROP CONSTRAINT [ IF EXISTS ]  constraint_name [ RESTRICT | CASCADE ]
        | CLUSTER ON index_name
        | SET WITHOUT CLUSTER
        | SET ( {storage_parameter = value} [, ... ] )
        | RESET ( storage_parameter [, ... ] )
        | OWNER TO new_owner
        | SET TABLESPACE new_tablespace
        | SET {COMPRESS|NOCOMPRESS}
        | DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { HASH ( column_name [,...] ) } }
        | TO { GROUP groupname | NODE ( nodename [, ... ] ) }
        | ADD NODE ( nodename [, ... ] )
        | DELETE NODE ( nodename [, ... ] )
        | DISABLE TRIGGER [ trigger_name | ALL | USER ]
        | ENABLE TRIGGER [ trigger_name | ALL | USER ]
        | ENABLE REPLICA TRIGGER trigger_name
        | ENABLE ALWAYS TRIGGER trigger_name
        | DISABLE ROW LEVEL SECURITY
        | ENABLE ROW LEVEL SECURITY
        | FORCE ROW LEVEL SECURITY
        | NO FORCE ROW LEVEL SECURITY
        | REFRESH STORAGE
    
    • ADD table_constraint [ NOT VALID ]

      给表增加一个新的约束。

    • ADD table_constraint_using_index

      根据已有唯一索引为表增加主键约束或唯一约束。

    • VALIDATE CONSTRAINT constraint_name

      验证一个外键或是一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。

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

      删除一个表上的约束。

    • CLUSTER ON index_name

      为将来的CLUSTER操作选择默认索引。实际上并没有重新盘簇化处理该表。

    • SET WITHOUT CLUSTER

      从表中删除最新使用的CLUSTER索引。这样会影响将来那些没有声明索引的集群操作。

    • SET ( {storage_parameter = value} [, ... ] )

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

    • RESET ( storage_parameter [, ... ] )

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

    • OWNER TO new_owner

      将表、序列、视图的属主改变成指定的用户。

    • SET {COMPRESS|NOCOMPRESS}

      修改表的压缩特性。表压缩特性的改变只会影响后续批量插入的数据的存储方式,对已有数据的存储毫无影响。也就是说,表压缩特性的修改会导致该表中同时存在着已压缩和未压缩的数据。

    • DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { HASH ( column_name [,...] ) } }

      修改表的分布方式,在修改表分布信息的同时会将表数据在物理上按新分布方式重新分布,修改完成后建议对被修改表执行ANALYZE,以便收集全新的统计信息。

      • 本操作属于重大变更操作,涉及表分布信息的修改以及数据的物理重分布,修改过程中会阻塞业务,修改完成后原有业务的执行计划会发生变化,请按照正规变更流程进行。
      • 本操作属于资源密集操作,针对大表的分布方式修改,建议在计算和存储资源充裕情况下进行,保证整个集群和原表所在表空间有足够的剩余空间能存储一张与原表同等大小且按照新分布方式进行分布的表。
    • TO { GROUP groupname | NODE ( nodename [, ... ] ) }

      此语法仅在扩展模式(GUC参数support_extended_features为on时)下可用。该模式谨慎打开,主要供内部扩容工具使用,一般用户不应使用该模式。

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

      此语法主要供内部扩容工具使用,一般用户不建议使用。

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

      此语法主要供内部缩容工具使用,一般用户不建议使用。

    • DISABLE TRIGGER [ trigger_name | ALL | USER ]

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

      应谨慎使用此功能,因为如果不执行触发器,则无法保证原先期望的约束的完整性。

    • ENABLE TRIGGER [ trigger_name | ALL | USER ]

      启用trigger_name所表示的单个触发器,或启用所有触发器,或仅启用用户触发器。

    • ENABLE REPLICA TRIGGER trigger_name

      触发器触发机制受配置变量session_replication_role的影响,当复制角色为“origin”(默认值)或“local”时,将触发简单启用的触发器。

      配置为ENABLE REPLICA的触发器仅在会话处于“replica”模式时触发。

    • ENABLE ALWAYS TRIGGER trigger_name

      无论当前复制模式如何,配置为ENABLE ALWAYS的触发器都将触发。

    • DISABLE/ENABLE ROW LEVEL SECURITY

      开启或关闭表的行访问控制开关。

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

    • NO FORCE/FORCE ROW LEVEL SECURITY

      强制开启或关闭表的行访问控制开关。

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

    • REFRESH STORAGE

      根据OBS冷热表storage_policy所定义的规则,将符合条件的本地热分区切换为存储在OBS上的冷分区。

      例如创建OBS冷热表时,设置storage_policy 为 'LMT:10',则在执行该操作时可将10日前无修改的分区切为冷存储,存至OBS中。

    • 其中列相关的操作column_clause可以是以下子句之一:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]    
          | MODIFY [ COLUMN ] column_name data_type
          | MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ]
          | MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NULL    
          | MODIFY [ COLUMN ] column_name DEFAULT default_expr
          | MODIFY [ COLUMN ] column_name ON UPDATE on_update_expr
          | MODIFY [ COLUMN ] column_name COMMENT comment_text
          | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]    
          | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ 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 [, ...] )) 
          | ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] LOCAL [ ( { PARTITION index_partition_name } [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ]
          | ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ WHERE predicate ]
          | DROP { INDEX | KEY } index_name
          | CHANGE [ COLUMN ] old_column_name new_column_name data_type [ [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] |
              [ CONSTRAINT constraint_name ] NULL | DEFAULT default_expr | COMMENT 'text' ]
          | DELETE 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 ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]

        向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。

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

        向表中增加多列。

      • MODIFY [ COLUMN ] column_name data_type

        修改表已存在字段的数据类型。

      • MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ]

        为表的某列添加not null约束,列存表暂不支持。

      • MODIFY [ COLUMN ] column_name [ CONSTRAINT constraint_name ] NULL

        为表的某列移除not null约束。

      • MODIFY [ COLUMN ] column_name DEFAULT default_expr

        修改表的default值。

      • MODIFY [ COLUMN ] column_name ON UPDATE on_update_expr

        修改表中指定列的on update表达式,该列必须为timestamp类型或者timestamptz类型,当on_update_expr为NULL值时,则为删除ON UPDATE子句。

      • MODIFY [ COLUMN ] column_name COMMENT comment_text

        修改表的注释信息。

      • DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]

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

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

      • ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]

        改变表字段的数据类型,只允许相同大类的类型转换(数值之间,字符串之间,时间之间等)。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。

        ALTER TYPE要求重写整个表的特性有时候是一个优点,因为重写的过程消除了表中没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间,最快的方法是

        1
        ALTER TABLE table ALTER COLUMN anycol TYPE anytype;
        

        这里的anycol是任何在表中还存在的字段,而anytype是和该字段的原类型一样的类型。这样的结果是在表上没有任何可见的语意的变化,但是这个命令强制重写,这样就删除了不再使用的数据。

      • 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 { INDEX | UNIQUE [ INDEX ] } [ index_name ] ( { { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] } [, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] LOCAL [ ( { PARTITION index_partition_name } [, ...] ) ] [ WITH ( { storage_parameter = value } [, ...] ) ]

        为表的分区表创建索引,具体参数可参考CREATE INDEX。

      • ADD { INDEX | UNIQUE [ INDEX ] } [ index_name ] ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] ) [ USING method ] [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] [ COMMENT 'text' ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ WHERE predicate ]

        在表上创建索引,具体参数可参考CREATE INDEX。

      • DROP { INDEX | KEY } index_name

        删除一个表上的索引。

      • CHANGE [ COLUMN ] old_column_name new_column_name data_type [ [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] |

        [ CONSTRAINT constraint_name ] NULL | DEFAULT default_expr | COMMENT 'text' ]

        修改表中列信息,可将旧列名修改成新列名,以及修改列字段信息。

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

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

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

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

        设置/重置属性选项。

        属性选项定义的参数有:n_distinct、n_distinct_inherited和cstore_cu_sample_ratio。n_distinct 设置并固定表的distinct值统计信息,n_distinct_inherited 设置并固定继承表的distinct值统计信息,cstore_cu_sample_ratio 设置对cstore列存表进行analyze时所选CU的比例。目前,禁止SET/RESET n_distinct_inherited参数。
        • n_distinct

          手动设置该列的distinct值统计信息。

          取值范围:-1.0 ~ INT_MAX

          默认值:0,表示不设置。

        • n_distinct_inherited

          手动设置继承表的该列的distinct值统计信息。

          取值范围:-1.0 ~ INT_MAX

          默认值:0,表示不设置。

        • cstore_cu_sample_ratio

          设置列存表执行analyze,计算需要采样的CU个数时,需要扩大的倍数。

          取值范围:1.0 ~ 10000.0

          默认值:1.0

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

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

      • 其中列约束column_constraint为:
        1
        2
        3
        4
        5
        6
        7
        8
        [ CONSTRAINT constraint_name ]
            { NOT NULL |
              NULL |
              CHECK ( expression ) |
              DEFAULT default_expr  |
              UNIQUE [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] index_parameters |
              PRIMARY KEY index_parameters }
            [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
        
      • 其中列的压缩可选项compress_mode为:
        1
        [ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS ]
        
    • 其中根据已有唯一索引为表增加主键约束或唯一约束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
      [ CONSTRAINT constraint_name ]
          { CHECK ( expression ) |
            UNIQUE [ NULLS [ NOT ] DISTINCT | NULLS IGNORE ] ( column_name [, ... ] ) index_parameters |
            PRIMARY KEY ( column_name [, ... ] ) index_parameters }
           
          [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
      
      其中索引参数index_parameters为:
      1
      2
      [ WITH ( {storage_parameter = value} [, ... ] ) ]
          [ USING INDEX TABLESPACE tablespace_name ]
      
support.huaweicloud.com/devg-dws-v3/dws_16_0039.html