暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T ALTER TABLE

墨天轮 2019-10-12
2602

ALTER TABLE

功能描述

ALTER TABLE功能指通过更改、添加、删除列和约束来更改表的定义,功能包括:

  • 列的添加、删除、修改、重命名。
  • 约束的添加、删除。
  • 约束的启动和禁用。
  • 修改分区的表空间。
  • 分裂分区。

注意事项

  • 执行该语句的用户需要有ALTER ANY TABLE系统权限,普通用户不可以修改系统用户对象。
  • 当指定表名、列名、约束名冲突、无效,数据和启用非验证状态冲突时,返回包含有效信息的错误提示。
  • 增加表中列属性时,保证表中无记录。
  • 修改表中列属性时,保证表中所有记录该列为NULL。如果该列不为NULL,只允许将char/varchar类型的大小改大,其他类型和操作均不支持。
  • 增加和修改列属性时,不能指定列唯一索引、主键索引、外键inline约束。
  • shrink_clause 、row_movement_clause和字符集目前只支持SQL解析。
  • ALTER TABLE不支持外部表。
  • enable_disable_clause只支持外键和check约束。
  • 数据库重启回滚期间不支持该操作。

语法格式

ALTER TABLE [ schema_name. ]table_name { alter_table_properties | column_clauses | references_clause | constraint_clauses | partition_clauses | enable_disable_clause | set_interval_clause }
  • alter_table_properties 子句:
    { physical_attributes_clause | RENAME TO new_table_name | shrink_clause | row_movement_clause | AUTO_INCREMENT [ = ] value | {ENABLE | DISABLE} ALL TRIGGERS }
    • physical_attributes_clause 子句:
      { PCTFREE integer | APPENDONLY { ON | OFF } }
    • shrink_clause 子句:
      SHRINK SPACE [ COMPACT ]
    • row_movement_clause 子句:
      { ENABLE | DISABLE } ROW MOVEMENT
  • column_clauses 子句:
    { add_column_clause | modify_column_clause | drop_column_clause | rename_column_clause }
    • add_column_clause 子句:
      --新增单列。 ADD [ COLUMN ] column_name datatype_name [ DEFAULT expr [ON UPDATE expr ] ] [ COMMENT 'string' ] [ COLLATE collation_name ] [AUTO_INCREMENT] [ inline_constraint ]
      --新增多列。 ADD ( [ COLUMN ] { column_name datatype_name [ DEFAULT expr [ON UPDATE expr ] ] [ COMMENT 'string' ] [ COLLATE collation_name ] [AUTO_INCREMENT] [ inline_constraint ] } [ , ... ] )
      • inline_constraint 子句:
        { [ NOT ] NULL | CHECK( expr ) | WITH [ LOCAL ] TIME ZONE | PRIMARY KEY | UNIQUE } [ ... ]
    • modify_column_clause 子句:
      --变更列。 MODIFY ( { column_name [ new_datatype_name ] [ DEFAULT expr [ ON UPDATE expr ] ] [ COMMENT string ] [ COLLATE collation_name ] [ inline_constraint ] } [ , ... ] ) --收缩LOB字段占用的空间。 MODIFY LOB(column_name) (SHRINK SPACE)
    • drop_column_clause 子句:
      DROP [ COLUMN ] column_name
    • rename_column_clause 子句:
      RENAME COLUMN old_name TO new_name
  • references_clause 子句:

    父表不指定列,默认取父表的主键,如果父表的主键不存在,则报错。

    REFERENCES [ schema_name. ]object_table [( column_name )]
  • constraint_clauses 子句:
    { ADD out_of_line_constraint | DROP CONSTRAINT [ IF EXISTS ] constraint_name | RENAME CONSTRAINT old_constraint_name TO new_constraint_name }
    • out_of_line_constraint 子句:
      CONSTRAINT [ IF NOT EXISTS ] constraint_name { UNIQUE( column_name [ , ... ] ) [ constraint_state_clause ] | PRIMARY KEY( column_name [ , ... ] ) [ constraint_state_clause ] | CHECK( expr ) | FOREIGN KEY( column_name [ , ... ] ) references_clause_ex }
      • constraint_state_clause 子句:
        constraint_state_clause 子句中除了using_index_clause以外都只是实现语法兼容,这些选项在当前版本中暂不生效。另外,这些选项可以连续指定,并无先后顺序区别。同一组选项也可多次指定,但解析结果中保存的是该组选项最后一次指定的值。
        [ NOT DEFERRABLE | DEFERRABLE ] [ INITIALLY { IMMEDIATE | DEFERRED } ] [ RELY | NORELY ] [ VALIDATE | NOVALIDATE ] [ ENABLE | DISABLE ] [ using_index_clause ]
        • using_index_clause 子句:
          USING INDEX [ INITRANS integer | TABLESPACE tablespace_name | LOCAL [ ( { PARTITION partition_name [ TABLESPACE tablespace_name | INITRANS integer | PCTFREE integer ] } [ , ... ] ) ] ] [ ... ]
      • references_clause_ex 子句:
        父表不指定列,默认取父表的主键,如果父表的主键不存在,则报错。
        REFERENCES [ schema_name. ]object_table_name [( column_name [ , ... ] )] [ ON DELETE { CASCADE | SET NULL } ]
  • partition_clauses 子句:
    { add_partition_clause | drop_partition_clause | truncate_partition_clause | coalesce_partition_clause | split_partition_clause }
    • add_partition_clause 子句:
      ADD PARTITION partition_name { VALUES LESS THAN ( { partition_value | MAXVALUE }[ , ... ] ) | VALUES ( partition_value [ , ... ] | DEFAULT ) } [ TABLESPACE tablespace_name ] [ PCTFREE integer ]
    • drop_partition_clause 子句:
      DROP PARTITION partition_name
    • truncate_partition_clause 子句:
      TRUNCATE PARTITION partition_name [ DROP STORAGE | REUSE STORAGE | PURGE ]
    • coalesce_partition_clause 子句:
      COALESCE PARTITION
  • split_partition_clause 子句:
    SPLIT PARTITION partition_name AT(range_value) INTO (PARTITION part_name1 [ TABLESPACE space_name ], PARTITION part_name2 [ TABLESPACE space_name ]) [UPDATE GLOBAL INDEXES]
  • enable_disable_clause子句:
    { ENABLE | DISABLE } [VALIDATE | NOVALIDATE] CONSTRAINT constraint_name
  • set_interval 子句:
    SET INTERVAL([interval_value])

参数说明

  • [schema_name.]

    用户名。不指定时默认是当前登录用户。

  • table_name

    表名,表必须存在。

  • alter_table_properties

    修改表存储属性。例如LOB_storage_clause指定lob字段单独segment储存,可以指定线内存储和线外存储。目前存储层只支持线外存储。

    • physical_attributes_clause

      表物理属性子句。

      PCTFREE integer

      为一个块保留的空间百分比。当数据块的可用空间低于该空间百分比时,只能更新该数据块的数据,不能向该数据块插入新数据。取值范围是[8,80],默认值是10。

      APPENDONLY { ON | OFF }

      并发插入时,各线程独立扩展空间,提升表插入数据速度。默认为关闭。

      ON

      并发插入时,各个线程独立扩展空间。

      OFF

      并发插入时,各个线程不独立扩展空间。

    • RENAME TO new_table_name

      重命名表名称。

    • shrink_clause

      收缩子句。

      SPACE

      空间。执行ALTER TABLE SHRINK SPACE语句时,如果并发的执行SELECT语句,可能会读到不一致的结果。因为shrink会截断表,导致row id发生变化,如果按照索引去找,找不到对应的数据。

      COMPACT

      压缩选项,带compact选项,表压缩时只做表的段整理,不压缩高水位。

    • row_movement_clause

      行迁移子句。

      { ENABLE | DISABLE } ROW MOVEMENT

      启用或禁止行迁移。

    • AUTO_INCREMENT [ = ] value

      修改表自增列的起始值。不指定时,从0开始。

    • {ENABLE | DISABLE} ALL TRIGGERS

      启用或禁止触发器。

  • column_clauses

    修改表属性,包括增加、删除、修改列。

    • add_column_clause

      增加列。

      DEFAULT expr [ON UPDATE expr]

      列默认值支持表达式,在创建DDL时,如果DEFAULT是常量表达式会向列类型做兼容检查。

      • [on update expr] :兼容语法,UPDATE行数据,不指定该列,取update默认值填充。
      • insert和update default expr最大长度为1024英文字符长度,default后面的文本超过最大长度将会报错“GS-00611, default value string is too long, exceed 1024.”。

      COMMENT 'string'

      指定列的注释,通过USER_COL_COMMENTS系统视图查看。

      COLLATE collation_name

      定义排序的规则。

      当比较两个列的数据时,根据所定义的排序规则确定哪个比较大或者是否相等。

      collation_name表示所定义的排序规则的名称,取值如下:

      • UTF8_BIN:适用UTF8字符集。将所有字符看作二进制串,然后从最高位往最低位比对。区分大小写。
      • UTF8_GENERAL_CI:适用UTF8字符集,不区分大小写。
      • UTF8_UNICODE_CI:适用UTF8字符集,不区分大小写。
      • GBK_BIN:适用GBK字符集,区分大小写。
      • GBK_CHINESE_CI:适用GBK字符集,不区分大小写。

        inline_constraint

        列约束,作为列定义的一部分,现支持[NOT] NULL、UNIQUE、PRIMARY KEY、唯一索引、外键、check约束。

    • modify_column_clause

      修改指定的一列或多列的属性,包括修改列的数据类型,和收缩LOB字段占用的空间。

      修改列的数据类型,只有在空表或者列数据全部为NULL时,可以做不兼容的数据类型修改。做兼容数据类型修改必须满足表中有数据,且待修改列的值不全是NULL。目前支持的兼容数据类型修改包括:

      • VARCHAR类型和CHAR类型相互转换(修改后的长度不小于修改前的长度)。
      • VARCHAR、CHAR、BINARY类型扩大长度。
      • NUMBER、DECIMAL类型扩大范围(scale和precision - scale都不得小于修改前)。
    • drop_column_clause

      删除列。

    • rename_column_clause

      重命名列。

  • references_clause

    添加外键约束。schema_name表示所参考表的所有者,object_table表示所参考的表。column_name表示所参考的字段。

  • constraint_clauses

    修改表约束,包括增加、删除行内约束、行外约束。

    • ADD out_of_line_constraint

      添加行外约束。

      IF NOT EXISTS

      创建行外约束的时候,如果约束已经存在,不做改动,直接返回成功。

      using_index_clause

      外部索引语句。

      INITRANS integer

      存储块上的初始化分配空间。integer为空间大小。

      TABLESPACE tablespace_name

      指定表空间。tablespace_name为表空间的名称

      LOCAL

      创建分区表的本地索引。

      ONLINE

      在线添加。

      CHECK( expr )

      对列值校验。若列插入数据为NULL,则默认校验为TRUE。

      references_clause_ex

      外键约束子句。

      ON DELETE { CASCADE | SET NULL }

      该属性用于外键,参照外表发生删除时,本表级联变化。

      • CASCADE

        本表删除。

      • SET NULL

        本表设置为NULL。

    • DROP CONSTRAINT [ IF EXISTS ] constraint_name

      删除约束,constraint_name为约束的名称。

      IF EXISTS

      如果约束不存在,直接返回成功。

    • DROP primary_key_clauses

      删除主键。

      PRIMARY KEY [DROP|KEEP INDEX]

      DROP

      删除主键的同时删除索引。

      KEEP

      删除主键,不删除索引。

  • partition_clauses

    分区子句。

    • add_partition_clause

      增加分区子句。

      VALUE LESS THAN

      值小于。

      partition_value

      分区值。

      MAXVALUE

      最大值。

      VALUE

      值为。

      DEFAULT

      默认值。

    • drop_partition_clause

      DROP PARTITION partition_name

      删除分区,partition_name为分区名。

    • truncate_partition_clause

      清空分区子句,partition_name 为分区名称。

      DROP STORAGE

      清除存储空间。

      REUSE STORAGE

      重用空间。

      PURGE

      清空回收站。

    • coalesce_partition_clause

      COALESCE PARTION

      将最后一个分区的数据插入到前边的某个分区里,再把最后一个分区删除。

      • 仅限hash分区才能执行COALESCE PARTION语句,无需指定分区名。
      • 如果只剩一个分区,执行COALESCE PARTION语句会报错。
    • split_partition_clause

      分裂分区,将指定的分区分裂为两个分区,原始分区的数据重分布到新的分区中。

      • partition_name

        需要分裂的分区名称。

      • part_name1 part_name2

        分裂后新的分区名称,两个分区名称不能重复。

      • range_value

        分裂的边界值。

      当前仅range分区支持split操作。

      • UPDATE GLOBAL INDEXES
        • 若指定update global indexes,则数据重分布完会自动重建全局索引(如果有的话)。
        • 若不指定,则全局索引处于invalid的状态。
  • enable_disable_clause

    启用或禁用约束,并指定启用或禁用约束时是否确保已有记录符合约束。

    • ENABLE:启用约束。
    • DISABLE:禁用约束。
    • VALIDATE:启用或禁用约束时以及约束被启用或禁用后,确保已有数据符合约束。
    • NOVALIDATE:启用或禁用约束时以及约束被启用或禁用后,不考虑已有数据是否符合约束。

    使用VALIDATE或NOVALIDATE,对新增记录和所更新的记录没有影响。也就是说,无论是使用VALIDATE还是使用NOVALIDATE,在使用ENABLE启用约束后都会检查新增记录和所更新的记录是否符合约束,但是在使用DISABLE禁用约束后则都不再检查新增记录和所更新的记录是否符合约束。

    使用VALIDATE或NOVALIDATE会对已有记录产生影响。也就是说,在启用或禁用约束时以及约束被启用或禁用后,如果使用VALIDATE,则会检查已有记录是否符合约束,如果不符合,则启用或禁用约束失败或新增修改纪录时返回错误信息;使用NOVALIDATE,在启用或禁用约束时以及约束被启用或禁用后,则不会检查已有记录是否符合约束。

    使用ENABLE启用约束时,如果不指定使用NOVALIDATE,则默认使用VALIDATE,效果等同于ENABLE VALIDATE,检查已有记录、新增或修改的记录是否都符合约束;指定NOVALIDATE,则允许已有记录不必符合约束,但新增或修改的记录必须满足约束。

    使用DISABLE禁用约束时,如果不指定使用VALIDATE,则默认使用NOVALIDATE,效果等同于DISABLE NOVALIDATE,禁用约束,删除约束上的索引,且允许修改被约束的记录;指定VALIDATE,则禁用约束,删除约束字段上的索引,且不允许修改任何被约束的记录。

    快速了解{ ENABLE | DISABLE } [VALIDATE | NOVALIDATE]的组合特性,请参见表1。

    表1 关键字组合说明

    关键字组合

    是否检查已有记录符合约束

    是否检查新增或修改记录符合约束

    ENABLE VALIDATE

    yes

    yes

    ENABLE NOVALIDATE

    no

    yes

    DISABLE VALIDATE

    yes

    no

    DISABLE NOVALIDATE

    no

    no

  • set_interval_clause

    设置间隔分区。仅对分区表有效。

    • SET INTERVAL():将范围分区表修改为间隔分区表。
    • SET INTERVAL(interval_value):修改间隔分区表的间隔值。
  • rename_column_clause

    修改表名。只能修改自己schema下的表名,不能修改系统表空间下的表名。

示例

  • 添加列。
    --删除表training。 DROP TABLE IF EXISTS training;
    --创建表training。 CREATE TABLE training(staff_id INT NOT NULL, course_name VARCHAR(50), course_start_date DATETIME, course_end_date DATETIME, exam_date DATETIME, score INT);
    --添加列full_masks。 ALTER TABLE training ADD full_masks INT;
  • 删除列。
    ALTER TABLE training DROP course_period;
  • 修改列的数据类型。
    ALTER TABLE training MODIFY course_name VARCHAR(20);
  • 添加约束。
    ALTER TABLE training ADD CONSTRAINT ck_training CHECK(staff_id>0); ALTER TABLE training ADD CONSTRAINT uk_training UNIQUE(course_name);
  • 重命名约束。
    ALTER TABLE training RENAME CONSTRAINT ck_training TO ck_new_training; ALTER TABLE training RENAME CONSTRAINT uk_training TO uk_new_training;
  • 删除约束。
    ALTER TABLE training DROP CONSTRAINT uk_new_training;
  • 重命名表。
    ALTER TABLE training RENAME TO training_2018;
  • 删除分区training3和training4。
    --删除表training。 DROP TABLE IF EXISTS training;
    --创建分区表training。 CREATE TABLE training(staff_id INT NOT NULL, course_name CHAR(20), course_period DATETIME, exam_date DATETIME, score INT) PARTITION BY RANGE(staff_id) ( PARTITION training1 VALUES LESS THAN(100), PARTITION training2 VALUES LESS THAN(200), PARTITION training3 VALUES LESS THAN(300), PARTITION training4 VALUES LESS THAN(MAXVALUE) );
    --删除分区training3。 ALTER TABLE training DROP PARTITION training3; --删除分区training4。 ALTER TABLE training DROP PARTITION training4;
  • 添加分区training5和training6。
    --添加分区training5。 ALTER TABLE training ADD PARTITION training5 VALUES LESS THAN(350); --添加分区training6。 ALTER TABLE training ADD PARTITION training6 VALUES LESS THAN(MAXVALUE);
  • 分裂分区。
    --分裂分区training5 ALTER TABLE training SPLIT PARTION training5 AT(300) INTO (PARTITION p1, PARTITION p2);
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论