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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论