首批通过分布式安全可靠测评,为关键业务系统打造
ALTER TABLE
更新时间:2023-08-03 17:20:32
描述
该语句用来修改已存在的表的结构,例如修改表及表属性、新增列、修改列及属性、删除列等。
语法
alter_table_stmt:
ALTER TABLE table_name alter_table_action_list;
alter_table_action_list:
alter_table_action [, alter_table_action ...]
alter_table_action:
ADD [COLUMN] column_definition
[FIRST | AFTER column_name]
| ADD [COLUMN] (column_definition_list)
| ADD [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY}
[index_name] index_desc
| ADD [CONSTRAINT [constraint_name]] FOREIGN KEY
[index_name] index_desc
REFERENCES reference_definition
[match_action][opt_reference_option_list]
| ADD {INDEX | KEY}
[index_name] index_desc
| ADD PARTITION (range_partition_list)
| ALTER [COLUMN] column_name {
SET DEFAULT const_value
| DROP DEFAULT
}
| ALTER INDEX index_name
[VISIBLE | INVISIBLE]
| CHANGE [COLUMN] column_name column_definition
| DROP [COLUMN] column_name
| DROP {INDEX | KEY} index_name
| DROP {PARTITION | SUBPARTITION} partition_name_list
| DROP TABLEGROUP
| DROP FOREIGN KEY fk_name
| MODIFY [COLUMN] column_definition
| RENAME [TO] table_name
| RENAME {INDEX | KEY} old_index_name TO new_index_name
| REORGANIZE PARTITION name_list INTO partition_range_or_list
| [SET] table_option_list
| TRUNCATE {PARTITION | SUBPARTITION} partition_name_list
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name data_type
[DEFAULT const_value] [AUTO_INCREMENT]
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
index_desc:
(column_desc_list) [index_type] [index_option_list]
match_action:
MATCH {SIMPLE | FULL | PARTIAL}
opt_reference_option_list:
reference_option [,reference_option ...]
reference_option:
ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULLX | NO ACTION | SET DEFAULT}
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [(length)] [ASC | DESC]
index_type:
USING BTREE
index_option_list:
index_option [ index_option ...]
index_option:
[GLOBAL | LOCAL]
| block_size
| compression
| STORING(column_name_list)
| comment
table_option_list:
table_option [ table_option ...]
table_option:
| primary_zone
| replica_num
| table_tablegroup
| block_size
| compression
| AUTO_INCREMENT [=] INT_VALUE
| comment
| DUPLICATE_SCOPE [=] "none|zone|region|cluster"
| parallel_clause
parallel_clause:
{NOPARALLEL | PARALLEL integer}
partition_option:
PARTITION BY HASH(expression)
[subpartition_option] PARTITIONS partition_count
| PARTITION BY KEY([column_name_list])
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
[subpartition_option] (range_partition_list)
subpartition_option:
SUBPARTITION BY HASH(expression)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY KEY(column_name_list)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
(range_subpartition_list)
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
expression_list:
expression [, expression ...]
column_name_list:
column_name [, column_name ...]
partition_name_list:
partition_name [, partition_name ...]
partition_count | subpartition_count:
INT_VALUE
参数解释
| 参数 | 描述 |
|---|---|
| ADD [COLUMN] | 增加列,支持增加生成列。
说明 |
| [FIRST | AFTER column_name] | 将新增的列作为表的第一列或在 column_name 列之后。 目前,OceanBase 数据库仅支持在 ADD COLUMN 语法中设置列的位置。 |
| CHANGE [COLUMN] | 修改列名和列定义,仅支持增加特定字符数据类型(VARCHAR、VARBINARY、CHAR 等)的长度。 |
| MODIFY [COLUMN] | 修改列定义,仅支持增加特定字符数据类型(VARCHAR、VARBINARY、CHAR 等)的长度。 |
| ALTER [COLUMN] {SET DEFAULT const_value | DROP DEFAULT} | 修改列的默认值。 |
| DROP [COLUMN] | 删除列,不允许删除主键列或者包含索引的列。 |
| ADD UNIQUE {INDEX | KEY} | 增加唯一索引。 创建唯一索引的同时也会为表增加与索引同名的约束。
|
| ADD FOREIGN KEY | 增加外键。 如果不指定外键名,则会使用表名 + OBFK + 创建时间命名。(例如,在 2021 年 8 月 1 日 00:00:00 为 t1 表创建的外键名称为 t1_OBFK_1627747200000000)。 |
| ADD {INDEX | KEY} | 增加普通索引。 INDEX 与 KEY 同义。 如果不指定索引名,则会使用索引引用的第一列作为索引名,如果命名存在重复,则会使用下划线(_)+ 序号的方式命名。(例如,使用 c1 列创建的索引如果命名重复,则会将索引命名为 c1_2。) 您可以通过 SHOW INDEX 语句查看表上的索引。 |
| ALTER INDEX | 修改索引是否可见,当索引状态为 INVISIBLE 时,SQL 优化器将不会选择该索引。 |
| ADD [PARTITION] | 为分区表增加分区。 OceanBase 数据库不支持将非分区表修改为分区表。 |
| DROP {PARTITION | SUBPARTITION} | 删除分区:
注意 |
| REORGANIZE [PARTITION] | 分区重组。
说明 |
| TRUNCATE {PARTITION | SUBPARTITION} | 删除分区数据:
注意 |
| RENAME [TO] table_name | 表重命名。 |
| RENAME {INDEX | KEY} | 重命名索引或键。 |
| DROP [TABLEGROUP] | 删除表组。 |
| DROP [FOREIGN KEY] | 删除外键。 |
| [SET] table_option | 设置表级属性,可选以下参数:
|
示例
将表
t2的字段d改名为c,并同时修改字段类型为INTEGER。obclient> ALTER TABLE t2 CHANGE COLUMN d c INT;增加、删除列。
增加列前,执行
DESCRIBE test;命令查看表信息,如下图所示:
执行以下命令增加
c3列。obclient> ALTER TABLE test ADD c3 INTEGER ;增加列后,执行
DESCRIBE test;命令查看表信息,如下图所示:
执行以下命令删除
c3列。obclient> ALTER TABLE test DROP c3;删除列后,执行
DESCRIBE test;命令查看表信息,如下图所示:
为表添加
c4列,并将该列设置为test表的第一列。obclient> ALTER TABLE test ADD COLUMN c4 INTEGER FIRST;设置表
test的副本数。obclient> ALTER TABLE test SET REPLICA_NUM=2;为表
t1添加外键约束fk1。obclient> ALTER TABLE t1 ADD CONSTRAINT fk1 FOREIGN KEY (c3) REFERENCES t2(c1);删除
t1表的外键约束fk1。obclient> ALTER TABLE t1 DROP FOREIGN KEY fk1;索引操作。
将
test表的索引ind1重命名为ind2。obclient> ALTER TABLE test RENAME INDEX ind1 TO ind2;在
test表上创建索引ind1,引用c1、c2列。obclient> ALTER TABLE test ADD INDEX ind1 (c1,c2) USING BTREE;可以通过
SHOW INDEX语句查看创建的索引。obclient> SHOW INDEX FROM test; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | test | 0 | PRIMARY | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES | | test | 1 | ind1 | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES | | test | 1 | ind1 | 2 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ 3 rows in set删除
test表上的索引ind2。obclient> ALTER TABLE test DROP INDEX ind2;
说明
在实际运维场景中,您可以通过以上方式实现索引的原子性变更。
清除分区表
t_log_part_by_range的分区M202001和M202002中的全部数据。obclient> CREATE TABLE t_log_part_by_range ( log_id bigint NOT NULL , log_value varchar(50) , log_date timestamp NOT NULL ) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) ( PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01')) , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01')) , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01')) , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01')) , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE t_log_part_by_range TRUNCATE PARTITION M202001, M202002; Query OK, 0 rows affected为分区表
t_log_part_by_range添加分区M202006。obclient> CREATE TABLE t_log_part_by_range ( log_id bigint NOT NULL , log_value varchar(50) , log_date timestamp NOT NULL ) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) ( PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01')) , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01')) , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01')) , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01')) , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE t_log_part_by_range ADD PARTITION (PARTITION M202006 VALUES LESS THAN(UNIX_TIMESTAMP('2020/07/01')) );修改表
t1的并行度为2。obclient> ALTER TABLE t1 PARALLEL 2;