基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
ALTER TABLE
更新时间:2026-08-24 14:12:55
描述
该语句用来修改已存在表的结构,例如修改表及表属性、新增列、修改列及属性、删除列等。
权限要求
执行 ALTER TABLE 语句,需要当前用户拥有 ALTER 权限。有关 OceanBase 数据库权限的详细介绍,请参见 MySQL 模式下的权限分类。
语法
ALTER TABLE table_name {alter_table_action_list | alter_partition_option};
alter_table_action_list:
alter_table_action [, alter_table_action ...]
alter_table_action:
[SET] table_options
| ADD [COLUMN] column_name column_definition
| ADD [COLUMN] (column_definition_list)
| ALTER [COLUMN] column_name {SET DEFAULT const_value
| DROP DEFAULT}
| DROP [COLUMN] column_name
| CHANGE [COLUMN] column_name new_column_name column_definition
| MODIFY [COLUMN] column_name column_definition
| RENAME COLUMN column_name TO new_column_name
| ADD [SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option [ index_option ...]]
| ADD [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
| ADD [CONSTRAINT [constraint_name]] UNIQUE [INDEX | KEY] [unique_index_name] index_desc
| ADD [CONSTRAINT [constraint_name]] CHECK (expression) [[NOT] ENFORCED]
| ADD [CONSTRAINT [constraint_name]] FOREIGN KEY [foreign_index_name] index_desc REFERENCES source_tbl_name (source_key_part) [match_action] [reference_option_list]
| ALTER INDEX index_name {parallel_option | visibility_option}
| ALTER {CHECK | CONSTRAINT} constraint_name [NOT] ENFORCED
| DROP INDEX index_name
| DROP PRIMARY KEY [, ADD PRIMARY KEY (column)]
| DROP {CHECK | CONSTRAINT} constraint_name
| DROP FOREIGN KEY fk_name
| DROP TABLEGROUP
| RENAME {INDEX | KEY} old_index_name TO new_index_name
| RENAME [TO] new_table_name
table_options:
table_option [table_option ...]
table_option:
[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| TABLEGROUP [=] tablegroup_name
| BLOCK_SIZE integer
| LOB_INROW_THRESHOLD [=] num
| COMPRESSION [=] 'compression_value'
| AUTO_INCREMENT [=] int_value
| COMMENT 'string'
| TTL (ttl_definition)
| ROW_FORMAT [=] row_format_value
| PCTFREE [=] num
| parallel_option
| DUPLICATE_SCOPE [=] 'none | cluster'
| TABLE_MODE [=] 'table_mode_value'
compression_value:
none
| lz4_1.0
| zstd_1.0
| snappy_1.0
row_format_value:
REDUNDANT
| COMPACT
| DYNAMIC
| COMPRESSED
| DEFAULT
parallel_option:
NOPARALLEL
| PARALLEL integer
table_mode_value:
NORMAL
| QUEUING
| MODERATE
| SUPER
| EXTREME
column_definition:
data_type [DEFAULT const_value] [AUTO_INCREMENT] [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [COMMENT 'string'] [ON UPDATE CURRENT_TIMESTAMP] [FIRST | {BEFORE column_name} | {AFTER column_name}]
| data_type [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] [opt_generated_column_attribute] [FIRST | {BEFORE column_name} | {AFTER column_name}]
column_definition_list:
column_name column_definition [, column_name column_definition ...]
index_type:
USING BTREE
key_part:
{index_col_name [(length)]
| (expr)} [ASC]
index_option:
[GLOBAL | LOCAL]
| BLOCK_SIZE integer
| COMPRESSION [=] 'compression_value'
| STORING (column_name_list)
| COMMENT 'string'
column_name_list:
column_name [, column_name ...]
index_desc:
(column_desc [, column_desc ...]) [index_type] [index_option [ index_option ...]]
column_desc:
column_name [(length)] [ASC | DESC]
reference_option_list:
reference_option [, reference_option ...]
reference_option:
ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}
parallel_option:
NOPARALLEL
| PARALLEL integer
visibility_option:
VISIBLE
| INVISIBLE
alter_partition_option:
ADD PARTITION (partition_range_or_list)
| DROP PARTITION partition_name_list
| DROP SUBPARTITION subpartition_name_list
| TRUNCATE PARTITION partition_name_list
| TRUNCATE SUBPARTITION subpartition_name_list
| modify_partition_info
partition_range_or_list:
range_partition_element_list
| list_partition_element_list
range_partition_element_list:
range_partition_element [, range_partition_element ...]
range_partition_element:
PARTITION partition_name VALUES LESS THAN (expr | MAXVALUE) [(subpartition_element)]
subpartition_element:
range_subpartition_definition_list
| list_subpartition_definition_list
| hash_subpartition_definition_list
| key_subpartition_definition_list
range_subpartition_definition_list:
range_subpartition_definition [, range_subpartition_definition ...]
range_subpartition_definition:
SUBPARTITION subpartition_name VALUES LESS THAN (expr | MAXVALUE)
list_subpartition_definition_list:
list_subpartition_definition [, list_subpartition_definition ...]
list_subpartition_definition:
SUBPARTITION subpartition_name VALUES IN (value_list | DEFAULT)
hash_subpartition_definition_list:
hash_subpartition_definition [, hash_subpartition_definition ...]
hash_subpartition_definition:
SUBPARTITION subpartition_name
key_subpartition_definition_list:
key_subpartition_definition [, key_subpartition_definition ...]
key_subpartition_definition:
SUBPARTITION subpartition_name
list_partition_element_list:
list_partition_element [, list_partition_element ...]
list_partition_element:
PARTITION partition_name VALUES IN (value_list | DEFAULT) [(subpartition_element)]
partition_name_list:
partition_name [, partition_name ...]
subpartition_name_list:
subpartition_name [, subpartition_name ...]
modify_partition_info:
PARTITION BY RANGE {(expr) | COLUMNS(column_name_list)} [subpartition_option]
{(range_partition_definition [(subpartition_definition)]
[, range_partition_definition [(subpartition_definition)] ... ]
)}
| PARTITION BY LIST {(expr) | COLUMNS (column_name_list)} [subpartition_option]
{(list_partition_definition [(subpartition_definition)]
[, list_partition_definition [(subpartition_definition)] ...]
)}
| PARTITION BY HASH(expr) [subpartition_option]
{(hash_partition_definition [(subpartition_definition)]
[, hash_partition_definition [(subpartition_definition)] ...]
)}
| PARTITION BY KEY(column_name_list) [subpartition_option]
{(key_partition_definition [(subpartition_definition)]
[, key_partition_definition [(subpartition_definition)] ...]
)}
subpartition_option:
SUBPARTITION BY RANGE {(expr) | COLUMNS (column_name_list)}
| SUBPARTITION BY LIST {(expr) | COLUMNS (column_name_list)}
| SUBPARTITION BY HASH (expr)
| SUBPARTITION BY KEY(column_name_list)
range_partition_definition:
PARTITION partition_name VALUES LESS THAN (expr | MAXVALUE)
list_partition_definition:
PARTITION partition_name VALUES IN (value_list | DEFAULT)
hash_partition_definition/key_partition_definition:
PARTITION partition_name
subpartition_definition:
range_subpartition_definition_list
| list_subpartition_definition_list
| hash_subpartition_definition_list
| key_subpartition_definition_list
参数说明
| 参数 | 描述 |
|---|---|
| table_name | 指定表名称。 |
| alter_table_action_list | 表示表结构修改的操作列表,包括修改表属性、新增列、修改列属性、删除列和约束等。可以同时指定多个操作,使用英文逗号(,)分隔。详细介绍可参见下文 alter_table_action。 |
| alter_partition_option | 表示对表的分区进行操作,例如增加分区、删除分区和清除分区数据等。分区操作的详细介绍可参见下文 alter_partition_option。 |
alter_table_action
[SET] table_options:用于设置表属性,例如如表的压缩算法、字符集、自增列的初始值等。可以设置多个表属性,表属性间使用英文逗号(,)分开。详细介绍可参见下文 table_option。ADD [COLUMN] column_name column_definition:用于增加一个新列,支持增加生成列。column_name:指定列名称。column_definition:指定列定义。有关列定义的详细介绍可参见下文 column_definition。
示例如下:
创建表
tbl1。CREATE TABLE tbl1 (col1 INT(11) PRIMARY KEY, col2 VARCHAR(50), col3 VARCHAR(50));在表
tbl1中的col2之前增加一个生成列 c4,数据类型为VARCHAR(100),生成规则为拼接col2和col3的值。ALTER TABLE tbl1 ADD c4 VARCHAR(100) GENERATED ALWAYS AS (CONCAT(col2, ' ', col3)) VIRTUAL BEFORE col2;执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | PRI | NULL | | | c4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | +-------+--------------+------+------+---------------------------+-------------------+ 4 rows in set
ADD [COLUMN] (column_definition_list):用于一次增加多个新列。column_definition_list:列定义列表,列定义包括列名和数据类型等。有关列定义的详细介绍可参见下文 column_definition。
示例如下:
在表
tbl1中同时增加c5和c6两列,数据类型为INT(1)。ALTER TABLE tbl1 ADD (c5 INT(1), c6 INT(1));执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | PRI | NULL | | | c4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | | c5 | int(1) | YES | | NULL | | | c6 | int(1) | YES | | NULL | | +-------+--------------+------+------+---------------------------+-------------------+ 6 rows in set
ALTER [COLUMN] column_name {SET DEFAULT const_value | DROP DEFAULT}:用于修改列的默认值。SET DEFAULT const_value:用于设置列的默认值。DROP DEFAULT:用于删除列的默认值。
示例如下:
在表
tbl1中设置列c5的默认值为 0。ALTER TABLE tbl1 ALTER c5 SET DEFAULT 0;执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | PRI | NULL | | | c4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | | c5 | int(1) | YES | | 0 | | | c6 | int(1) | YES | | NULL | | +-------+--------------+------+------+---------------------------+-------------------+ 6 rows in set
DROP [COLUMN] column_name:用于删除指定的列。示例如下:
删除表
tbl1中的列c6。ALTER TABLE tbl1 DROP c6;执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | PRI | NULL | | | c4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | | c5 | int(1) | YES | | 0 | | +-------+--------------+------+------+---------------------------+-------------------+ 5 rows in set
CHANGE [COLUMN] column_name new_column_name column_definition:用于修改列名和列定义。有关列定义的详细介绍可参见下文 column_definition。new_column_name:指定列的新名称。
示例如下:
将表
tbl1的列c5改名为col5,并将数据类型改为VARCHAR(1)ALTER TABLE tbl1 CHANGE COLUMN c5 col5 VARCHAR(1);执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | PRI | NULL | | | c4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | | col5 | varchar(1) | YES | | NULL | | +-------+--------------+------+------+---------------------------+-------------------+ 5 rows in set
MODIFY [COLUMN] column_name column_definition:用于修改列的定义。有关列定义的详细介绍可参见下文 column_definition。示例如下:
将表
tbl1中列col5的数据类型改为INT(1),并设置为非空。ALTER TABLE tbl1 MODIFY col5 INT(1);执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | PRI | NULL | | | c4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | | col5 | int(1) | NO | | NULL | | +-------+--------------+------+------+---------------------------+-------------------+ 5 rows in set
RENAME COLUMN column_name TO new_column_name:用于重命名列。该语法不改变列定义,仅修改列名。如果目标名称在表中已经存在,那么RENAME COLUMN执行会报错,但是重命名为原名称则不会报错。- 如果重命名的列上建有索引,
RENAME COLUMN可以正常执行,索引定义会自动级联修改。 - 如果重命名列被前缀索引引用,
RENAME COLUMN可以正常执行,前缀索引支持级联修改。 - 如果重命名的列上建有外键约束,
RENAME COLUMN可以正常执行,外键约束会自动级联修改。
OceanBase 数据库在以下场景,不支持修改或者不会自动级联修改:
- 重命名的列被生成列表达式引用,不支持修改列名,执行会报错。
- 重命名的列被分区表达式引用,不支持修改列名,执行会报错。
- 重命名的列被
CHECK约束引用,不支持修改列名,执行会报错。 - 重命名的列被函数索引引用,不支持修改列名,执行会报错。
- 重命名的列被视图引用,
RENAME COLUMN执行成功,查询视图会报错,需要用户手动修改视图定义。 - 重命名的列被存储过程引用,
RENAME COLUMN执行成功,CALLProcedure 报错,需要用户手动修改。
示例如下:
在表
tbl1中同时增加c5和c6两列,数据类型为INT(1)。ALTER TABLE tbl1 RENAME COLUMN c4 TO col4;执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | PRI | NULL | | | col4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | | col5 | int(1) | NO | | NULL | | +-------+--------------+------+------+---------------------------+-------------------+ 5 rows in set
- 如果重命名的列上建有索引,
ADD [SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option [ index_option ...]]:用于添加索引。SPATIAL:指定创建的索引为空间索引。更多有关空间索引的介绍和限制信息,参见 空间索引。INDEX | KEY:为创建的表指定键或索引。这两个关键词是等价的。index_name:可选项,指定索引名称。如果不指定索引名,则会使用索引引用的第一列作为索引名,如果命名存在重复,则会使用下划线(_)+ 序号的方式命名。(例如,使用c1列创建的索引如果命名重复,则会将索引命名为c1_2。) 您可以通过SHOW INDEX语句查看表上的索引。index_type:可选项,用来指定索引使用的索引类型。key_part:指定索引要包含的列名或表达式。index_col_name [(length)]:指定表中的列作为索引列,并可以通过可选的length参数指定索引列的长度。例如,可以使用id(10)来指定id列作为索引列,并且只使用该列的前 10 个字符作为索引。expr:表示合法的函数索引表达式,且允许是布尔表达式,例如c1=c1。在 OceanBase 数据库的 MySQL 模式中,对函数索引的表达式进行了限制,禁止部分系统函数的表达式作为函数索引,具体的函数列表请参见 函数索引支持的系统函数列表 和 函数索引不支持的系统函数列表。注意
OceanBase 数据库当前版本禁止创建生成列上的函数索引。
ASC:可选项,表示按升序排序,目前暂不支持降序(DESC)排列。
index_option:可选项,指定索引选项列表。创建索引时可以指定多个索引选项,索引选项间使用英文空格分开,具体如下:GLOBAL:表示创建全局索引。LOCAL:表示创建局部索引,为默认值。BLOCK_SIZE integer:指定索引块的大小,即每个索引块中的字节数。STORING(column_name_list):指定要存储在索引中的列,多个列间使用英文逗号(,)分开。COMMENT 'string':为索引添加注释。
示例如下:
在
tbl1表上创建索引idx1_tbl1,引用col2、col3列。ALTER TABLE tbl1 ADD INDEX idx1_tbl1 (col2, col3);通过
SHOW INDEX语句查看在tbl1表上创建的索引。SHOW INDEX FROM tbl1;返回结果如下:
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl1 | 0 | PRIMARY | 1 | col1 | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL | | tbl1 | 1 | idx1_tbl1 | 1 | col2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | | tbl1 | 1 | idx1_tbl1 | 2 | col3 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 3 rows in set
ADD [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc:用于添加主键约束。可以指定一个或多个列作为主键。如果是多个列,它们将组成复合主键。主键指定约束名时,仅语法上支持,功能不生效。示例如下:
创建表
tbl2。CREATE TABLE tbl2 (col1 INT, col2 INT, col3 VARCHAR(50));向表
tbl2添加一个主键约束,该主键约束由列col1定义。ALTER TABLE tbl2 ADD PRIMARY KEY (col1);执行
DESCRIBE命令查看表tbl2信息。DESCRIBE tbl2;返回结果如下:
+-------+-------------+------+------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+------+---------+-------+ | col1 | int(11) | NO | PRI | NULL | | | col2 | int(11) | YES | | NULL | | | col3 | varchar(50) | YES | | NULL | | +-------+-------------+------+------+---------+-------+ 3 rows in set
ADD [CONSTRAINT [constraint_name]] UNIQUE [INDEX | KEY] [unique_index_name] index_desc:用于添加唯一性约束。unique_index_name:可选项,指定唯一约束名称。
示例如下:
向表
tbl2添加一个唯一约束,该唯一约束由列col2定义。ALTER TABLE tbl2 ADD UNIQUE unique1_tbl2 (col2);执行
DESCRIBE命令查看表tbl2信息。DESCRIBE tbl2;返回结果如下:
+-------+-------------+------+------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+------+---------+-------+ | col1 | int(11) | NO | PRI | NULL | | | col2 | int(11) | YES | UNI | NULL | | | col3 | varchar(50) | YES | | NULL | | +-------+-------------+------+------+---------+-------+ 3 rows in set
ADD [CONSTRAINT [constraint_name]] CHECK (expression) [[NOT] ENFORCED]:用于添加表的检查约束,限制列中的值的范围。示例如下:
向表
tbl2添加一个CHECK约束,约束的条件是col2的值必须大于 5 才能满足约束。ALTER TABLE tbl2 ADD CONSTRAINT check1_tbl2 CHECK (col2 > 5);ADD [CONSTRAINT [constraint_name]] FOREIGN KEY [foreign_index_name] index_desc REFERENCES source_tbl_name (source_key_part) [match_action] [reference_option_list]:用于添加外键约束。foreign_index_name:可选项,指定外键约束名称。如果不指定外键名,则会使用 表名 +OBFK+ 创建时间命名。(例如,在 2021 年 8 月 1 日 00:00:00 为t1表创建的外键名称为t1_OBFK_1627747200000000)。source_tbl_name: 指定外键引用的源表的名称。source_key_part: 指定与目标表建立关联的源表列名称。opt_reference_option_list:用于指定外键引用选项列表,包括在引用表更新或删除时采取的动作。外键允许跨表交叉引用相关数据,当UPDATE或DELETE操作影响与子表相匹配行的父表中键值时,其结果取决于ON UPDATE和ON DELETE子句的引用操作:CASCADE:表示从父表中删除或更新行,并自动删除或更新子表中匹配的行。SET NULL:表示从父表中删除或更新行,并将子表中的外键列设置为NULL。RESTRICT:表示拒绝对父表的删除或更新操作。NO ACTION:指定延迟检查。SET DEFAULT:当父表中的引用项被删除时,子表中对应的外键列会被设置为默认值。
示例如下:
为表
tbl2添加外键约束fk1_tbl2,该外键约束指定了表中的col2列作为外键,它引用了tbl1表中的col1列。在更新tbl1中的数据时,如果主键列(col1)发生变化,那么tbl2中的外键列(col2)将被设置为NULL。ALTER TABLE tbl2 ADD CONSTRAINT fk1_tbl2 FOREIGN KEY (col2) REFERENCES tbl1(col1) ON UPDATE SET NULL;ALTER INDEX index_name {parallel_option | visibility_option}:用于修改索引,可以设置索引的并行选项或者可见性选项。NOPARALLEL:并行度为1,默认配置。PARALLEL integer:指定并行度,integer取值大于等于1。VISIBLE:修改索引可见。INVISIBLE:修改索引不可见,SQL 优化器将不会选择该索引。
示例如下:
修改表
tbl1中索引idx1_tbl1的并行度为 3。ALTER TABLE tbl1 ALTER INDEX idx1_tbl1 PARALLEL 3;ALTER {CHECK | CONSTRAINT} constraint_name [NOT] ENFORCED:用于修改表中的约束(CHECK或CONSTRAINT)是否被强制执行的设置。DROP INDEX index_name:用于删除指定的索引。注意
- 由于已有实现中同时添加和删除索引的功能是非原子的,可能导致系统在一段时间内无索引可用的状态(例如,为了将索引
idx1_tbl1(col1, col2)修改为idx1_tbl2(col1, col2, col3),在执行ALTER TABLE tbl1 DROP INDEX idx1_tbl1, ADD INDEX idx1_tbl2(col1, col2, col3);时,会先删除原有索引idx1_tbl1,然后再创建索引idx1_tbl2,在这过程中会出现一段时间内idx1_tbl1不存在,idx1_tbl2也未被创建好),因此从 OceanBase 数据库 V4.2.1 BP10 版本开始,该操作已禁用。 - 可以通过使用命令
ALTER SYSTEM SET _enable_drop_and_add_index = true;来打开配置项,从而允许在一条 SQL 语句中同时执行添加和删除索引操作,此操作需谨慎使用。
示例如下:
删除表
tbl1中的索引idx1_tbl1。ALTER TABLE tbl1 DROP INDEX idx1_tbl1;- 由于已有实现中同时添加和删除索引的功能是非原子的,可能导致系统在一段时间内无索引可用的状态(例如,为了将索引
DROP PRIMARY KEY [, ADD PRIMARY KEY (column)]:用于删除主键,并且可以重新添加新的主键。示例如下:
删除表
tbl1的主键,并且重新添加主键。ALTER TABLE tbl1 DROP PRIMARY KEY, ADD PRIMARY KEY(col2);执行
DESCRIBE命令查看表tbl1信息。DESCRIBE tbl1;返回结果如下:
+-------+--------------+------+------+---------------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+------+---------------------------+-------------------+ | col1 | int(11) | NO | | NULL | | | col4 | varchar(100) | YES | | CONCAT(`col2`,' ',`col3`) | VIRTUAL GENERATED | | col2 | varchar(50) | NO | PRI | NULL | | | col3 | varchar(50) | YES | | NULL | | | col5 | int(1) | NO | | NULL | | +-------+--------------+------+------+---------------------------+-------------------+ 5 rows in set
DROP {CHECK | CONSTRAINT} constraint_name:用于删除指定的约束(CHECK或CONSTRAINT)。示例如下:
删除表
tbl2中的CHECK约束check1_tbl2。ALTER TABLE tbl2 DROP CHECK check1_tbl2;DROP FOREIGN KEY fk_name:用于删除指定的外键。示例如下:
删除表
tbl2中的外键约束fk1_tbl2。ALTER TABLE tbl2 DROP FOREIGN KEY fk1_tbl2;DROP TABLEGROUP:用于删除表组。示例如下:
删除表
tbl2的所属表组。ALTER TABLE tbl2 DROP TABLEGROUP;RENAME {INDEX | KEY} old_index_name TO new_index_name:用于重命名索引。RENAME [TO] new_table_name:用于重命名表。示例如下:
将表
tbl2的名称改为tbl_2。ALTER TABLE tbl2 RENAME tbl_2;
table_option
[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name:指定表的默认字符集。OceanBase 数据库 MySQL 模式可使用字符集的详细信息,参见 字符集。[DEFAULT] COLLATE [=] collation_name:指定表的默认字符序。OceanBase 数据库 MySQL 模式可使用字符序的详细信息,参见 字符序。CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]:指定表的默认字符集和字符序。TABLEGROUP [=] tablegroup_name:指定表所属的表组。BLOCK_SIZE integer:指定表的微块大小。LOB_INROW_THRESHOLD [=] num:用于配置INROW阈值,当 LOB 数据大小超过该阈值时,会转为OUTROW存储在 LOB Meta 表中,默认为 4KB。有关 LOB 类型的介绍信息,参见 LOB 类型。COMPRESSION [=] 'compression_value':指定表的压缩算法。取值如下:none:不使用压缩算法。lz4_1.0:使用lz4压缩算法。zstd_1.0:使用zstd压缩算法。snappy_1.0: 使用snappy压缩算法。
AUTO_INCREMENT [=] int_value:指定表中自增列的初始值(起始值)。COMMENT 'string':指定表注释。不区分大小写。TTL (ttl_definition):Time To Live,指定删除过期数据。更多介绍信息,参见 过期数据删除功能。ROW_FORMAT [=] row_format_value:指定表是否开启 Encoding 存储格式。取值如下:REDUNDANT:不开启 Encoding 存储格式。COMPACT:不开启 Encoding 存储格式。DYNAMIC:Encoding 存储格式。COMPRESSED:Encoding 存储格式。DEFAULT:等价dynamic模式。
PCTFREE [=] num:指定宏块保留空间百分比。parallel_option:指定表级别的并行度。取值如下:NOPARALLEL:并行度为1,默认配置。PARALLEL integer:指定并行度,integer取值大于等于1。
示例如下:
修改表
tbl1的并行度为2。ALTER TABLE tbl1 PARALLEL 2;DUPLICATE_SCOPE [=] 'none | cluster':指定复制表的属性。取值如下:none:表示该表是一个普通表,为默认值。cluster:表示该表是一个复制表,Leader 需要将事务复制到当前租户的所有 F(全能)副本及 R(只读)副本。OceanBase 数据库目前仅支持cluster级别的复制表。
有关复制表的详细信息,参见 创建表 下 创建复制表 章节。
TABLE_MODE [=] 'table_mode_value':指定合并触发阈值与合并策略,即控制数据转储后的合并行为。取值如下:说明
在以下列出的
TABLE_MODE模式中,除了NORMAL模式之外,所有模式都代表QUEUING表。这种QUEUING表是最基本的表类型,并且随后列出的几种模式(除了 NORMAL 模式)代表了使用更加积极的合并策略。NORMAL:默认值,表示正常。在该模式下,数据转储后触发合并的概率极低。QUEUING:在该模式下,数据转储后触发合并的概率低。MODERATE:表示适度。在该模式下,数据转储后触发合并的概率为中等。SUPER:表示超级。在该模式下,数据转储后触发合并的概率高。EXTREME:表示极端。在该模式下,转储后触发合并的概率较高。
更多有关合并的信息,请参见 自适应合并。
column_definition
data_type [DEFAULT const_value] [AUTO_INCREMENT] [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [COMMENT 'string'] [FIRST | {BEFORE column_name} | {AFTER column_name}]:普通列的列定义。data_type:指定列的数据类型,例如整数、文本、日期等。OceanBase 数据库 MySQL 模式支持的数据类型及详细说明,参见 数据类型概述。[DEFAULT const_value]:可选项,指定列的默认值。[AUTO_INCREMENT]:可选项,指定该列是否为自增列。当前仅数据类型为整数类型的数据列(BOOL/BOOLEAN类型除外)可以设置为自增列。OceanBase 数据库支持使用自增列作为分区键。更多自增列的介绍,参见 定义自增列。[NULL | NOT NULL]:可选项,指定列的值是否可以为NULL或NOT NULL。如果未指定,则默认为NULL。[[PRIMARY] KEY]:可选项,指定该列作为主键,如果指定为主键,则该列的值必须是唯一的且不为空。[UNIQUE [KEY]]:可选项,指定该列为唯一键,保证该列的值是唯一的。[COMMENT 'string']:可选项,指定列注释。[FIRST | {BEFORE column_name} | {AFTER column_name}]:可选项,指定新增列的位置。如果不指定该参数,默认新增列的位置在末尾。FIRST:表示将新增列添加到表的最开始位置。BEFORE column_name:表示将新增列添加到指定的列之前位置。AFTER column_name:表示将新增列添加到指定的列之后位置。
说明
当前 OceanBase 数据库仅支持在
ADD COLUMN语法中设置列的位置。
data_type [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] [opt_generated_column_attribute] [FIRST | {BEFORE column_name} | {AFTER column_name}]:生成列的列定义。data_type:新列的数据类型。[GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]:创建生成列。[GENERATED ALWAYS] AS (expr):指定计算新列值的表达式。[VIRTUAL | STORED]:指定生成列是虚拟列还是存储列。VIRTUAL:列值不会被存储,而是在读取行时,在任何BEFORE触发器之后立即计算。虚拟列不占用存储空间。STORED:在插入或更新行时评估和存储列值。存储列确实需要存储空间并且可以被索引。
[opt_generated_column_attribute]:指定生成列的其他属性,例如列的注释。
alter_partition_option
有关分区类型的详细介绍,参见 分区概述。
ADD PARTITION (partition_range_or_list):用于向表中添加一级分区。更多有关新增分区的信息,参见 添加分区。注意
对于非模板化二级分区表,添加一级分区时,需要同时指定一级分区的定义和该一级分区下的二级分区定义。
示例如下:
创建分区表
tbl3。CREATE TABLE tbl3(col1 INT, col2 TIMESTAMP, col3 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(UNIX_TIMESTAMP(col2)) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), SUBPARTITION sp1 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')), SUBPARTITION sp2 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')), SUBPARTITION sp3 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01')) ), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp4 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), SUBPARTITION sp5 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01')), SUBPARTITION sp6 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')), SUBPARTITION sp7 VALUES LESS THAN(UNIX_TIMESTAMP('2022/01/01')) ) );向表
tbl3中添加一级分区p3和p4。ALTER TABLE tbl3 ADD PARTITION (PARTITION p3 VALUES LESS THAN(300) (SUBPARTITION sp8 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), SUBPARTITION sp9 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')) ), PARTITION p4 VALUES LESS THAN(400) (SUBPARTITION sp10 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), SUBPARTITION sp11 VALUES LESS THAN(UNIX_TIMESTAMP('2021/10/01')), SUBPARTITION sp12 VALUES LESS THAN(UNIX_TIMESTAMP('2021/12/01')) ) );
DROP PARTITION partition_name_list:用于删除表中指定的一级分区。更多有关删除分区的信息,参见 删除分区。示例如下:
删除表
tbl3中的一级分区p3和p4。ALTER TABLE tbl3 DROP PARTITION p3, p4;DROP SUBPARTITION subpartition_name_list:用于删除表中指定的二级分区。示例如下:
删除表
tbl3中的二级分区sp6和sp7。ALTER TABLE tbl3 DROP SUBPARTITION sp6, sp7;TRUNCATE PARTITION partition_name_list:用于清空指定一级分区内的数据。更多有关清空分区数据的信息,参见 Truncate 分区。示例如下:
清除表
tbl3一级分区p0和p1中的数据。ALTER TABLE tbl3 TRUNCATE PARTITION p0, p1;TRUNCATE SUBPARTITION subpartition_name_list:用于清空指定二级分区内的数据。示例如下:
清除表
tbl3二级分区sp0和sp1中的数据。ALTER TABLE tbl3 TRUNCATE SUBPARTITION sp0, sp1;modify_partition_info:用于修改分区规则(重分区),即修改表的分区方式和分区类型。更多修改分区规则的信息,参见 修改分区规则。示例如下:
将表
tbl3的分区方式由 Range + Range 改为 Range + List。ALTER TABLE tbl3 PARTITION BY RANGE(col1) SUBPARTITION BY LIST(col3) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES IN (1, 2, 3), SUBPARTITION sp1 VALUES IN (5, 6) ), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp2 VALUES IN (1, 2, 3), SUBPARTITION sp3 VALUES IN (5, 6) ) );