Purpose
This statement is used to modify the structure of an existing table, such as changing the table and its attributes, adding columns, changing columns and their attributes, and deleting columns.
Syntax
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
[ opt_position_column ]
| 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 PRIMARY KEY (column_name)
| ADD CONSTRAINT [constraint_name] CHECK (expression)[[NOT] ENFORCED]
| ADD PARTITION (range_partition_list)
| ADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option_list][index_column_group_option]
| ADD FULLTEXT [INDEX | KEY] [index_name](column_name, [column_name ...]) [WITH PARSER tokenizer_option] [PARSER_PROPERTIES[=](parser_properties_list)] [LOCAL]
| ADD COLUMN GROUP([all columns, ]each column) [DELAYED]
| ALTER [COLUMN] column_name {
SET DEFAULT const_value
| DROP DEFAULT
}
| ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
| ALTER INDEX index_name [VISIBLE | INVISIBLE] [STORAGE_CACHE_POLICY = {"hot"|"auto"|"none"}]
| CHANGE [COLUMN] column_name column_definition
| DROP [COLUMN] column_name [, DROP COLUMN column_name ...]
| DROP {PARTITION | SUBPARTITION} partition_name_list
| DROP TABLEGROUP
| DROP FOREIGN KEY fk_name
| DROP PRIMARY KEY [, ADD PRIMARY KEY (column)]
| DROP CHECK constraint_name
| DROP COLUMN GROUP([all columns, ]each column)
| MODIFY [COLUMN] column_definition
| RENAME COLUMN old_col_name [TO|AS] new_col_name
| RENAME [TO|AS] table_name
| RENAME {INDEX | KEY} old_index_name [TO|AS] new_index_name
| [SET] table_option_list
| TRUNCATE {PARTITION | SUBPARTITION} partition_name_list
| EXCHANGE PARTITION partition_name WITH TABLE origin_table_name WITHOUT VALIDATION
| REORGANIZE PARTITION partition_name INTO (split_range_partition_list)
| PARTITION BY {RANGE [COLUMNS]([column_name_list]) [SIZE('size_value')] [range_partition_list]
| partition_option}
| MODIFY PARTITION partition_name ADD SUBPARTITION (add_subpartition_option)
| ALTER {PARTITION | SUBPARTITION} partition_name STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}
| FORCE
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 string_value] [SKIP_INDEX(skip_index_option_list)] [ opt_position_column ]
skip_index_option_list:
skip_index_option [,skip_index_option ...]
skip_index_option:
MIN_MAX
| SUM
opt_position_column:
FIRST | BEFORE | AFTER column_name
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 NULL | NO ACTION | SET DEFAULT}
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [(length)] [ASC | DESC]
key_part:
{index_col_name [(length)] | (expr)} [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 string_value
| STORAGE_CACHE_POLICY (storage_cache_policy_option)
index_column_group_option:
WITH COLUMN GROUP([all columns, ]each column)
tokenizer_option:
SPACE
| NGRAM
| BENG
| IK
| NGRAM2
parser_properties_list:
parser_properties, [parser_properties]
parser_properties:
min_token_size = int_value
| max_token_size = int_value
| ngram_token_size = int_value
| ik_mode = 'char_value'
| min_ngram_size = int_value
| max_ngram_size = int_value
table_option_list:
table_option [ table_option ...]
table_option:
TABLEGROUP = tablegroup_name
| block_size
| lob_inrow_threshold [=] num
| compression
| AUTO_INCREMENT [=] INT_VALUE
| COMMENT string_value
| parallel_clause
| TABLE_MODE [=] 'table_mode_value'
| AUTO_INCREMENT_CACHE_SIZE [=] INT_VALUE
| READ {ONLY | WRITE}
| DUPLICATE_SCOPE= 'none | cluster'
| enable_macro_block_bloom_filter [=] {True | False}
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list)
| SEMISTRUCT_ENCODING_TYPE [=] 'encoding' # This parameter is deprecated in Version V4.4.1. Use SEMISTRUCT_PROPERTIES instead.
| SEMISTRUCT_PROPERTIES [=] (encoding_type=encoding|none[,freq_threshold=INT_VALUE])
| STORAGE_CACHE_POLICY (storage_cache_policy_option)
parallel_clause:
{NOPARALLEL | PARALLEL integer}
table_mode_value:
NORMAL
| QUEUING
| MODERATE
| SUPER
| EXTREME
dynamic_partition_policy_list:
dynamic_partition_policy_option [, dynamic_partition_policy_option ...]
dynamic_partition_policy_option:
ENABLE = {true | false}
| PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
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)
storage_cache_policy_option:
GLOBAL = {"hot" | "auto" | "none"}
| timeline_strategy_list
timeline_strategy_list:
BOUNDARY_COLUMN = column_name [,BOUNDARY_COLUMN_UNIT = {"s"| "ms"}] ,HOT_RETENTON = intnum retention_time_unit
retention_time_unit:
YEAR
| MONTH
| WEEK
| DAY
| HOUR
| MINUTE
split_range_partition_list:
PARTITION split_partition_name VALUES LESS THAN (value)
[, PARTITION split_partition_name VALUES LESS THAN (value) ...]
, PARTITION split_partition_name VALUES LESS THAN (source_value)
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
[STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}]
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
[STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}]
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_subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr
[, SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr] ...}
| {SUBPARTITION subpartition_name VALUES IN list_partition_expr
[, SUBPARTITION subpartition_name VALUES IN list_partition_expr] ...}
Parameters
| Parameter | Description |
|---|---|
| ADD [COLUMN] | Adds a column. Generated columns are supported. |
| [FIRST | BEFORE | AFTER column_name] | Specifies the position of the new column. The new column can be the first column of the table or located before or after the column_name column. Currently, OceanBase Database only supports setting the position of a column in the ADD COLUMN clause. |
| CHANGE [COLUMN] | Modifies the column name and column definition. Only the length of specific character data types (VARCHAR, VARBINARY, CHAR, etc.) can be modified. |
| MODIFY [COLUMN] | Modifies column attributes. |
| ALTER [COLUMN] {SET DEFAULT const_value | DROP DEFAULT} | Modifies the default value of a column. |
| DROP [COLUMN] | Drops a column.
NoticePrimary key columns cannot be dropped. |
| ADD FOREIGN KEY | Adds a foreign key. If no foreign key name is specified, the foreign key name will be automatically generated in the format of table name + OBFK + creation time. For example, the foreign key name created for the t1 table at 00:00:00 on August 1, 2021 is t1_OBFK_1627747200000000. A foreign key allows cross-table referencing of related data. When an UPDATE or DELETE operation affects the key values of rows in the parent table that match those in the child table, the result depends on the ON UPDATE and ON DELETE clauses of the reference operation:
SET DEFAULT operation is supported. |
| ADD PRIMARY KEY | Adds a primary key. You can specify one or more columns as the primary key. If multiple columns are specified, they form a composite primary key. |
| ADD FULLTEXT [INDEX | KEY] | Adds a full-text index. For more information, see Create a full-text index. |
| WITH PARSER tokenizer_option | Optional. Specifies the tokenizer for the full-text index. For more information, see tokenizer_option. |
| PARSER_PROPERTIES[=](parser_properties_list) | Optional. Specifies the properties of the tokenizer. For more information, see parser_properties. |
| ALTER INDEX | Modifies the visibility of an index. If the index status is INVISIBLE, the SQL optimizer will not select this index. |
| key_part | Creates a (function) index. |
| index_col_name | Specifies the column name for the index. ASC (ascending) is supported for each column name, but DESC (descending) is not. The default is ascending. The sorting order for the index is as follows: first, sort by the value of the first column in index_col_name; then, sort by the value of the next column name, and so on. |
| expr | Specifies a valid function index expression, which can be a boolean expression, for example, c1=c1.Notice OceanBase Database does not allow you to create a function index on a generated column. |
| ADD [PARTITION] | Adds a partition to a partitioned table. |
| DROP {PARTITION | SUBPARTITION} | Drops a partition:
Notice When you drop a partition, avoid active transactions or queries on the partition. Otherwise, an error may occur or some exceptions may be thrown. |
| TRUNCATE {PARTITION | SUBPARTITION} | Drops data in a partition:
Notice When you drop data in a partition, avoid active transactions or queries on the partition. Otherwise, an error may occur or some exceptions may be thrown. |
| RENAME COLUMN old_col_name [TO|AS] new_col_name | Renames a column. Only the column name is modified, and the column definition remains unchanged.
Notice
|
| RENAME [TO|AS] table_name | Renames a table.
NoticeDuring the |
| RENAME [TO] table_name | Renames a table.
NoticeDuring the |
| RENAME {INDEX | KEY} | Renames an index or key. |
| DROP [TABLEGROUP] | Drops a table group. |
| DROP [FOREIGN KEY] | Drops a foreign key. |
| DROP [PRIMARY KEY] | Drops a primary key.
NoteIn MySQL mode, you cannot drop a primary key in the following cases:
|
| [SET] table_option | Sets table-level attributes. Valid values:
|
| CHECK | Modifies the CHECK constraint. Valid operations:
|
| [NOT] ENFORCED | Specifies whether to enforce the CHECK constraint with the specified name constraint_name.
|
| ADD COLUMN GROUP([all columns, ]each column) [DELAYED] | Change the table to a columnar table. The specific explanation is as follows:
|
| DROP COLUMN GROUP([all columns, ]each column) | Change the storage format of the table. The specific explanation is as follows:
|
| index_column_group_option | Specify the index options. The specific explanation is as follows:
|
| SKIP_INDEX | Modify the Skip Index attribute of a column. Valid values:
Notice
|
| EXCHANGE PARTITION partition_name WITH TABLE origin_table_name | Specify a partition exchange. In this statement, partition_name specifies the name of the partition in the partitioned table, and origin_table_name specifies the name of the source table, which is a non-partitioned table or a partitioned table. For more information about partition exchange, see Partition exchange. |
| TABLE_MODE | An optional parameter that specifies the major compaction trigger threshold and strategy, which control the major compaction behavior after data is dumped. For more information about the values, see table_mode_value. |
| AUTO_INCREMENT_CACHE_SIZE | Specify the number of cached auto-increment values. The default value is 0, indicating that the system uses the tenant-level parameter auto_increment_cache_size to set the size of the cache for auto-increment columns. |
| READ {ONLY | WRITE} | Specify the read/write permissions of the table. The specific explanation is as follows:
|
| DUPLICATE_SCOPE | Change the duplicate table attribute of the table. Valid values:
|
| enable_macro_block_bloom_filter [=] {True | False} | Specify whether to persist the Bloom filter at the macro block level. Valid values:
|
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list) | Change the dynamic partition management attribute of the table. dynamic_partition_policy_list specifies the list of configurable parameters of the dynamic partition strategy, separated by commas. For more information about the parameters, see dynamic_partition_policy_option. |
| REORGANIZE PARTITION | Used to manually split a partition. The relevant parameters are as follows:
NoticeIn OceanBase Database in MySQL mode, the current version only supports splitting one partition into multiple partitions. It does not support splitting multiple partitions into multiple partitions. |
| PARTITION BY | Used to modify the automatic partitioning attributes of a table or modify the partitioning rules. The relevant parameters are as follows:
|
| MODIFY PARTITION partition_name ADD SUBPARTITION (add_subpartition_option) | Indicates adding a subpartition.
NoticeAdding a subpartition is not supported for partitions of the HASH or KEY type. |
| add_subpartition_option | Indicates the definition of the added subpartition. |
| range_partition_expr | Indicates the RANGE/RANGE COLUMNS partition expression. |
| list_partition_expr | Indicates the LIST/LIST COLUMNS partition expression. |
| FORCE | Used to drop obsolete columns.
NoteWhen some columns are deleted, they still occupy physical storage space even if they are no longer used. To remove these obsolete columns and reclaim the related space, you must drop them. |
| SEMISTRUCT_ENCODING_TYPE | Optional. Specifies the semistructured encoding type. Valid values:
NoticeStarting from V4.4.1, the |
| SEMISTRUCT_PROPERTIES | Optional. Specifies the semistructured encoding type in key-value pairs. Valid values:
For more information about how to use the semistructured encoding, see Use semistructured encoding. NoticeThis parameter is supported starting from V4.4.1. |
| STORAGE_CACHE_POLICY | Optional. Specifies the hot cache policy for a table or index in shared storage mode. For more information, see storage_cache_policy. |
| ALTER {PARTITION | SUBPARTITION} partition_name STORAGE_CACHE_POLICY | Specifies the hot cache policy for a partition in shared storage mode. For more information, see partition_storage_cache_policy. |
table_mode_value
Note
The following table lists the TABLE_MODE modes. All modes except NORMAL represent QUEUING tables. A QUEUING table is the most basic table type. The following modes (except NORMAL) represent more aggressive compaction strategies.
NORMAL: The default value. In this mode, the probability of triggering a major compaction after a data dump is very low.QUEUING: In this mode, the probability of triggering a major compaction after a data dump is low.MODERATE: In this mode, the probability of triggering a major compaction after a data dump is moderate.SUPER: In this mode, the probability of triggering a major compaction after a data dump is high.EXTREME: In this mode, the probability of triggering a major compaction after a data dump is very high.
For more information about major compactions, see Adaptive major compactions.
tokenizer_option
SPACE: The default value. In this mode, the text is tokenized by spaces. You can specify the following parameters:Parameter Value range min_token_size [1, 16] max_token_size [10, 84] NGRAM: In this mode, the text is tokenized based on N-grams (Chinese). You can specify the following parameters:Parameter Value range ngram_token_size [1, 10] NGRAM2: In this mode, the text is tokenized into continuous characters of length betweenmin_ngram_sizeandmax_ngram_size. You can specify the following parameters:Parameter Value range min_ngram_size [1, 16] max_ngram_size [1, 16] BENG: In this mode, the text is tokenized based on basic English (Beng). You can specify the following parameters:Parameter Value range min_token_size [1, 16] max_token_size [10, 84] IK: In this mode, the text is tokenized based on the IK (Chinese) tokenizer. Currently, only theutf-8character set is supported. You can specify the following parameter:Parameter Value range ik_mode smartmax_word
You can use the TOKENIZE function to view the tokenization result of the text in the specified tokenizer and JSON format.
parser_properties
min_token_size: The minimum token length. Default value: 3. Value range: 1 to 16.max_token_size: The maximum token length. Default value: 84. Value range: 10 to 84.ngram_token_size: The N-gram token length. This parameter is valid only for theNGRAMtokenizer. Default value: 2. Value range: 1 to 10.ik_mode: The tokenization mode of theIKtokenizer. Valid values:smart: The default value. The dictionary is used to improve the accuracy of tokenization. The boundaries of the dictionary are prioritized, which may reduce unnecessary expansions.max_word: The dictionary is used to identify the defined words, but it does not affect the maximum expansion of tokenization. Even if the dictionary contains defined words, themax_wordmode still attempts to split the text into more words.
min_ngram_size: The minimum token length. Value range: [1,16].max_ngram_size: The maximum token length. Value range: [1,16].
Here is an example:
Create a table named
tbl1.CREATE TABLE tbl1 (col1 VARCHAR(200), col2 TEXT);Add a full-text index named
fidxto thetbl1table.ALTER TABLE tbl1 ADD FULLTEXT INDEX fidx(col2) WITH PARSER ik PARSER_PROPERTIES=(ik_mode='max_word');
dynamic_partition_policy_option
ENABLE = {true | false}: Specifies whether to enable dynamic partition management. Valid values:true: The default value. Dynamic partition management is enabled.false: Dynamic partition management is disabled.
PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}: Specifies the precreation time. When dynamic partition management is scheduled, partitions are precreated so that the upper bound of the maximum partition > now() + precreate_time. Valid values:-1: The default value. No partitions are precreated.0: Only the current partition is precreated.n {hour | day | week | month | year}: Partitions are precreated for the specified time span. For example,3 hourindicates that partitions for the last 3 hours are precreated.
Note
- When multiple partitions are to be precreated, the interval between the boundaries of adjacent partitions is
TIME_UNIT. - The boundary of the first precreated partition is the ceiling of the upper bound of the existing maximum partition, rounded up to the nearest multiple of
TIME_UNIT.
EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}: Optional. Specifies the partition expiration time. When dynamic partition management is scheduled, all partitions whose upper bound < now() - expire_time are deleted. Valid values:-1: The default value. Partitions never expire.0: All partitions except the current one expire.n {hour | day | week | month | year}: The partition expiration time. For example,1 dayindicates that a partition expires after 1 day.
For more information about dynamic partition tables, see Modify a dynamic partition table.
Here is an example:
ALTER TABLE tbl2 SET DYNAMIC_PARTITION_POLICY(
ENABLE = true,
PRECREATE_TIME = '1 day',
EXPIRE_TIME = '-1'
);
storage_cache_policy
Different attributes in storage_cache_policy_option are defined in the key-value format. The semantics of each attribute are described as follows:
GLOBAL = {"hot" | "auto"| "none"}: specifies the hot cache strategy for the data of the entire table. Valid values:hot: indicates that all data in the specified table is hot data. If the cache disk space is sufficient, all data in the table will be cached to the local cloud disk.auto: indicates that the hot data in the specified table is automatically identified by the system.none: indicates that the strategy of the index follows the value ofSTORAGE_CACHE_POLICYof the primary table.Notice
The
noneattribute can be used only for indexes.
timeline_strategy_list: specifies the list of time axis strategy parameters. Parameters are separated by commas. The hot cache time axis strategy supports a mechanism to determine whether partition data is hot data based on time. The system automatically adjusts the partition data on the local cache disk based on the configured strategy.Note
A time axis is a partitioning range that is used to cache hot data. When a certain time condition is met, the data in the partition is considered hot data. When you use the time axis strategy, note the following:
- Only Range-partitioned tables (with Range partitioning as the primary or secondary partitioning) support the time axis strategy. This is because the system needs to determine whether the data has expired based on time, but it cannot determine the time for a double Range partition.
- When you use the time axis strategy, the partition expression can contain only column names. Expressions are not supported. For example,
PARTITION BY RANGE COLUMNS(expr(col3))is not supported. BOUNDARY_COLUMNmust be a partition key. If the partition key contains multiple columns,BOUNDARY_COLUMNmust be the first column, which is used to determine whether the partition has expired.
BOUNDARY_COLUMN = column_name: specifies the column used to determine hot data. Integer types (BIGINTorINT, in the Unix timestamp format) and time types (TIMESTAMP,DATE,DATETIME, orYEAR) are supported.- If the
BOUNDARY_COLUMNis of an integer type, the table can be partitioned by Range or Range Columns. - If the
BOUNDARY_COLUMNis of a time type, the table can be partitioned only by Range Columns.
- If the
BOUNDARY_COLUMN_UNIT = {"s" | "ms"}: specifies the time unit of theBOUNDARY_COLUMNparameter. This parameter can be set only when theBOUNDARY_COLUMNis of an integer type. If the integer value is used as a timestamp, you must specify the timestamp unit. Otherwise, the system may incorrectly parse the timestamp. Valid values:If the partition column is of the
INTtype, the value ofBOUNDARY_COLUMN_UNITcan be onlys.If the partition column is of the
BIGINTtype, the value ofBOUNDARY_COLUMN_UNITcan besorms.Notice
If the timestamp is not in the Unix timestamp format, the system cannot correctly identify the time represented by the
INTtype.
HOT_RETENTION = intnum retention_time_unit: specifies the time range of hot data.intnum: specifies an integer.retention_time_unit: specifies the time unit. Valid values:YEAR: specifies a year.MONTH: specifies a month.WEEK: specifies a week.DAY: specifies a day.HOUR: specifies an hour.MINUTE: specifies a minute.
partition_storage_cache_policy
STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}: specifies whether the data in the partition is hot data. Valid values:hot: indicates that the partition is hot data. If the cache disk space is sufficient, all data in the partition will be cached to the local cloud disk.auto: indicates that the hot data in the partition is automatically identified by the system.none: the default value. Indicates that the strategy of the partition follows the value ofSTORAGE_CACHE_POLICYof the primary table.
Examples
Add and drop columns
Create a sample table named tbl1 and execute the DESCRIBE command to view the table information.
obclient> CREATE TABLE tbl1 (c1 INT(11) PRIMARY KEY,c2 VARCHAR(50));
Query OK, 0 rows affected
obclient> DESCRIBE tbl1;
+-------+------------+----------+--------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+----------+--------+---------+-------+
| c1 | int(11) | NO | PRI | NULL | |
| c2 | varchar(50)| YES | | NULL | |
+-------+------------+----------+--------+---------+-------+
Add the
c3column and execute theDESCRIBEcommand to view the table information.obclient> ALTER TABLE tbl1 ADD c3 INT; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(50)| YES | | NULL | | | c3 | int(11) | YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 3 row affectedDrop the
c3column and execute theDESCRIBEcommand to view the table information.obclient> ALTER TABLE tbl1 DROP c3; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c2 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 2 row affectedRename the
c2column toc3in thetbl1table and execute theDESCRIBEcommand to view the table information.obclient> ALTER TABLE tbl1 CHANGE COLUMN c2 c3 VARCHAR(50); Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c1 | int(11) | NO | PRI | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 2 rows affectedAdd the
c4column to thetbl1table and set it as the first column of the table. Then, execute theDESCRIBEcommand to view the table information.obclient> ALTER TABLE tbl1 ADD COLUMN c4 INTEGER FIRST; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c4 | int(11) | YES | | NULL | | | c1 | int(11) | NO | PRI | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 3 row affectedAdd the
c2column after thec1column in thetbl1table and execute theDESCRIBEcommand to view the table information.obclient> ALTER TABLE tbl1 ADD COLUMN c2 INTEGER AFTER c1; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c4 | int(11) | YES | | NULL | | | c1 | int(11) | NO | PRI | NULL | | | c2 | int(11) | YES | | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 4 row affectedAdd the
c5column before thec4column in thetbl1table and execute theDESCRIBEcommand to view the table information.obclient> ALTER TABLE tbl1 ADD COLUMN c5 INT BEFORE c4; Query OK, 1 row affected obclient> DESCRIBE tbl1; +-------+------------+----------+--------+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+----------+--------+---------+-------+ | c5 | int(11) | YES | | NULL | | | c4 | int(11) | YES | | NULL | | | c1 | int(11) | NO | PRI | NULL | | | c2 | int(11) | YES | | NULL | | | c3 | varchar(50)| YES | | NULL | | +-------+------------+----------+--------+---------+-------+ 5 row affectedAdd the
fk1foreign key constraint to thetbl2table. When anUPDATEoperation affects the key values in the parent table that match the rows in the child table, execute theSET NULLoperation.obclient> CREATE TABLE tbl2(c1 INT PRIMARY KEY,c2 INT); Query OK, 0 row affected obclient> CREATE TABLE tbl3(c1 INT PRIMARY KEY,c2 INT); Query OK, 0 row affected obclient> ALTER TABLE tbl2 ADD CONSTRAINT fk1 FOREIGN KEY (c2) REFERENCES tbl3(c1) ON UPDATE SET NULL; Query OK, 0 row affectedDrop the
fk1foreign key constraint from thetbl3table.obclient> ALTER TABLE tbl2 DROP FOREIGN KEY fk1; Query OK, 0 row affectedDrop the primary key from the
tbl2table.obclient> ALTER TABLE tbl2 DROP PRIMARY KEY; Query OK, 0 row affected
Index operations
Rename the
ind1index in thetbl2table toind2.obclient> CREATE TABLE tbl2(c1 INT(11) PRIMARY KEY,c2 INT(50)); Query OK, 0 row affected obclient> CREATE INDEX ind1 ON tbl2 (c2 ASC); Query OK, 0 row affected obclient> ALTER TABLE tbl2 RENAME INDEX ind1 TO ind2; Query OK, 0 row affectedCreate an index named
ind3on thetbl2table, referencing thec1andc2columns.obclient> ALTER TABLE tbl2 ADD INDEX ind3 (c1,c2); Query OK, 0 row affectedYou can execute the
SHOW INDEXstatement to view the created index.obclient> SHOW INDEX FROM tbl2; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ | tbl2 | 0 | PRIMARY | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES | | tbl2 | 1 | ind2 | 1 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | | tbl2 | 1 | ind3 | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES | | tbl2 | 1 | ind3 | 2 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+ 4 rows in setDrop the
ind2index from thetbl2table.obclient> ALTER TABLE tbl2 DROP INDEX ind2; Query OK, 0 row affectedNote
In actual O&M scenarios, you can use the preceding methods to perform atomic index changes.
Add three function indexes to the
t1_functable. One of the indexes is namedi2, and the other two are automatically generated by the system with names in the format offunctional_indexfollowed by a number.obclient> ALTER TABLE t1_func ADD INDEX ((CONCAT(c1,'a'))); Query OK, 0 rows affected obclient> ALTER TABLE t1_func ADD INDEX ((c1+1)); Query OK, 0 rows affected obclient> ALTER TABLE t1_func ADD INDEX i2 ((CONCAT(c1,'a'))); Query OK, 0 rows affected obclient> SHOW CREATE TABLE t1_func; +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t1_func | CREATE TABLE `t1_func` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL, KEY `i1` (((`c1` + `c2`) < 1)) BLOCK_SIZE 16384 LOCAL, KEY `functional_index` (concat(`c1`,'a')) BLOCK_SIZE 16384 LOCAL, KEY `functional_index_2` ((`c1` + 1)) BLOCK_SIZE 16384 LOCAL, KEY `i2` (concat(`c1`,'a')) BLOCK_SIZE 16384 LOCAL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in setCreate a columnstore index on the table.
Execute the following SQL statement to create the
tbl3table.CREATE TABLE tbl3 (col1 INT, col2 VARCHAR(50));Create a columnstore index named
idx1_tbl3on thetbl3table, referencing thecol1column.ALTER TABLE tbl3 ADD INDEX idx1_tbl3 (col1) WITH COLUMN GROUP(each column);
Modify the index to be invisible.
Note
After an index is set to invisible, you can see the
/*!80000 INVISIBLE */tag in the table structure.Create the
tbl4table.CREATE TABLE tbl4 (col1 INT PRIMARY KEY, col2 INT, col3 INT);Create an index named
idx1_tbl4.CREATE INDEX idx1_tbl4 ON tbl4(col2);Modify the
idx1_tbl4index to be invisible.ALTER TABLE tbl4 ALTER INDEX idx1_tbl4 INVISIBLE;View the structure of the
tbl4table again.SHOW CREATE TABLE tbl4;The return result is as follows:
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl4 | CREATE TABLE `tbl4` ( `col1` int(11) NOT NULL, `col2` int(11) DEFAULT NULL, `col3` int(11) DEFAULT NULL, PRIMARY KEY (`col1`), KEY `idx1_tbl4` (`col2`) BLOCK_SIZE 16384 LOCAL /*!80000 INVISIBLE */ ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 WITH COLUMN GROUP(each column) | +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
Partition operations
Clear all data in the
M202001andM202002partitions of thet_log_part_by_rangepartitioned table.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 affectedAdd a partition named
M202006to thet_log_part_by_rangepartitioned table.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')) );
Change the parallelism
Change the parallelism of the
tbl3table to2.obclient> ALTER TABLE tbl3 PARALLEL 2;In addition to using the
ALTER TABLE table_name PARALLEL int;statement to change the parallelism of a table, you can also use thePARALLELhint. The syntax is as follows:alter /*+ parallel(int) */ table.
Operations related to column types
Modify the ordinary column
col1of thetbl4table to an auto-increment column.obclient> CREATE TABLE tbl4 (col1 BIGINT(10) NOT NULL,col2 INT); Query OK, 0 rows affected obclient> ALTER TABLE tbl4 MODIFY col1 BIGINT(10) AUTO_INCREMENT; Query OK, 0 rows affectedAdd the
col1column as the primary key of thetbl4table, and then change the primary key tocol2.obclient> ALTER TABLE tbl4 ADD PRIMARY KEY (col1); Query OK, 0 rows affected obclient> ALTER TABLE tbl4 DROP PRIMARY KEY,ADD PRIMARY KEY (`col2`); Query OK, 0 rows affectedAdd a
CHECKconstraint.obclient> CREATE TABLE tbl7(col1 VARCHAR(10),col2 VARCHAR(10)); Query OK, 0 rows affected obclient> ALTER TABLE tbl7 ADD CONSTRAINT my_check CHECK (col1> col2) ; Query OK, 0 rows affectedRemove the
CHECKconstraint from thetbl7table.obclient> ALTER TABLE tbl7 DROP CHECK my_check; Query OK, 0 rows affectedModify the column type to
NOT NULL.obclient> CREATE TABLE dept( deptno NUMBER(2,0), dname VARCHAR(14), location VARCHAR(13), CONSTRAINT pk_dept PRIMARY KEY(deptno) ); Query OK, 0 rows affected obclient> CREATE TABLE emp( empno NUMBER(4,0) NOT NULL, empname VARCHAR(10) NOT NULL, job VARCHAR(9) NOT NULL, mgr NUMBER(4,0) NOT NULL, hiredate DATE NOT NULL, sal NUMBER(7,2) DEFAULT NULL, comm NUMBER(7,2) DEFAULT NULL, deptno NUMBER(2,0) DEFAULT NULL, CONSTRAINT PK_emp PRIMARY KEY (empno), CONSTRAINT FK_deptno FOREIGN KEY (deptno) REFERENCES dept (deptno) ); Query OK, 0 rows affected obclient> ALTER TABLE emp MODIFY deptno NUMBER(2,0) DEFAULT '12' NOT NULL; Query OK, 0 rows affected
Rename a column and add a NOT NULL constraint
Notice
You can rename a column and add a not null constraint only if the following conditions are met:
- You can rename only one column and add only one
not nullconstraint at a time. - You can add only one
not nullconstraint. - You can perform only the
alter_columnoperation, and cannot create an index or partition. - The column that you rename and the column that you add a
not nullconstraint to must be the same column.
obclient> ALTER TABLE test_alter1 MODIFY COLUMN `C1` varchar(10) NOT NULL;
Query OK, 0 rows affected (2.421 sec)
Add NOT NULL constraints to two columns
Notice
You can add NOT NULL constraints to two columns only if the following conditions are met:
- You can add
NOT NULLconstraints to only two columns. - You can add only one
not nullconstraint. - You can perform only the
alter_columnoperation, and cannot create an index or partition. - You cannot modify other columns except for the two columns to which you add
not nullconstraints.
Execute the following command to add NOT NULL constraints to the C1 and c2 columns:
obclient> ALTER TABLE test_alter4 MODIFY COLUMN c1 varchar(10) NOT NULL, MODIFY COLUMN c2 varchar(10) NOT NULL;
Query OK, 0 rows affected (2.605 sec)
Change the column type of a column with a prefix index
Notice
You can change the column type of a column with a prefix index only if the following conditions are met:
- The original column type is
char. - The target column type is
varchar. - The length of the original column and the target column are the same.
Execute the following command to create a table named
test_alter5that contains a column namedc1of theCHAR(20)data type and has a prefix index namedidx_c1on thec1column:obclient> CREATE TABLE test_alter5 (c1 char(20), KEY idx_c1(c1(10)));Execute the following command to change the data type of the
c1column tovarchar(20):obclient> ALTER TABLE test_alter5 MODIFY COLUMN c1 varchar(20);
Change the foreign key constraint rules
Execute the following command to create a table named
t1and add a unique constraint to the integer columnc1:obclient> CREATE TABLE t1(c1 int unique key);Execute the following command to create a table named
t2that contains an integer column namedc1and define a foreign key constraint:obclient> CREATE TABLE t2(c1 int, CONSTRAINT fk_cst_test FOREIGN KEY (c1) REFERENCES t1(c1) on update set null on delete no action);Execute the following command to query the
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTSsystem table and obtain the update and delete rules of the foreign key constraint namedfk_cst_test:obclient> SELECT update_rule, delete_rule FROM information_schema.referential_constraints WHERE CONSTRAINT_NAME = 'fk_cst_test';The return result is as follows:
+-------------+-------------+ | update_rule | delete_rule | +-------------+-------------+ | SET NULL | NO ACTION | +-------------+-------------+UPDATE_RULE:SET NULLindicates that the foreign key is set toNULLwhen the value of the primary key is updated.DELETE_RULE:NO ACTIONindicates that the constraint is checked when the primary key is deleted, and the operation may be blocked.
Rename a column
The
RENAME COLUMNoperation does not change the column definition. It only modifies the column name. If the target name already exists in the table, theRENAME COLUMNoperation will return an error. However, if you rename the column back to its original name, no error will be returned.obclient> CREATE TABLE tbl8 (a INT, b INT); Query OK, 0 rows affected obclient> ALTER TABLE tbl8 RENAME COLUMN a TO b; ERROR 1060 (42S21): Duplicate column name 'b' obclient> ALTER TABLE tbl8 RENAME COLUMN a TO a; Query OK, 0 rows affectedIf an index is created on the column that you want to rename, the
RENAME COLUMNoperation can be executed normally, and the index definition will be automatically updated.obclient> CREATE TABLE tbl9 (a INT, b INT, index idx_a(a)); Query OK, 0 rows affected obclient> SHOW INDEX FROM tbl9; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl9 | 1 | idx_a | 1 | a | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 1 row in set obclient> ALTER TABLE tbl9 RENAME COLUMN a TO c; Query OK, 0 rows affected obclient> SHOW INDEX FROM tbl9; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl9 | 1 | idx_a | 1 | c | A | NULL | NULL | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 1 row in setIf the column that you want to rename is referenced by a prefix index, the
RENAME COLUMNoperation can be executed normally, and the prefix index will be automatically updated.DROP TABLE tbl9; obclient> CREATE TABLE tbl9 (c1 INT PRIMARY KEY, c2 BLOB, c3 INT, INDEX i1 (c2(10))); Query OK, 0 rows affected obclient> ALTER TABLE tbl9 RENAME COLUMN c2 TO c2_, RENAME COLUMN c1 TO c2_1; DESC tbl9; Query OK, 0 rows affected obclient> SHOW INDEX FROM tbl9; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ | tbl9 | 0 | PRIMARY | 1 | c2_1 | A | NULL | NULL | NULL | | BTREE | available | | YES | NULL | | tbl9 | 1 | i1 | 1 | c2_ | A | NULL | 10 | NULL | YES | BTREE | available | | YES | NULL | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+------------+ 2 rows in setIf a foreign key constraint is defined on the column that you want to rename, the
RENAME COLUMNoperation can be executed normally, and the foreign key constraint will be automatically updated.obclient> CREATE TABLE tbl10 (a INT PRIMARY KEY); Query OK, 0 rows affected obclient> CREATE TABLE tbl11(b INT, FOREIGN KEY (b) REFERENCES tbl10(a)); obclient> SHOW CREATE TABLE tbl11; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl11 | CREATE TABLE `tbl11` ( `b` int(11) DEFAULT NULL, CONSTRAINT `tbl11_OBFK_1694681944513338` FOREIGN KEY (`b`) REFERENCES `test`.`tbl10`(`a`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set obclient> ALTER TABLE tbl10 RENAME COLUMN a TO c; Query OK, 0 rows affected obclient> SHOW CREATE TABLE tbl11; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl11 | CREATE TABLE `tbl11` ( `b` int(11) DEFAULT NULL, CONSTRAINT `tbl11_OBFK_1694681944513338` FOREIGN KEY (`b`) REFERENCES `test`.`tbl10`(`c`) ON UPDATE RESTRICT ON DELETE RESTRICT ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set
OceanBase Database does not support modifying or automatically updating the following scenarios:
If the column that you want to rename is referenced by a generated list expression, the column name cannot be modified, and an error will be returned when the
RENAME COLUMNoperation is executed.obclient> CREATE TABLE tbl12(a INT, b INT AS (a + 1), c INT, d INT, CONSTRAINT d_check CHECK(d > 0)) PARTITION BY HASH(c + 1) PARTITIONS 2; obclient> ALTER TABLE tbl12 RENAME COLUMN a TO e; ERROR 3108 (HY000): Column 'a' has a generated column dependencyIf the column that you want to rename is referenced by a partitioning expression, the column name cannot be modified, and an error will be returned when the
RENAME COLUMNoperation is executed.obclient> ALTER TABLE tbl12 RENAME COLUMN c TO e; ERROR 3855 (HY000): Column 'c' has a partitioning function dependency and cannot be dropped or renamed.If the column that you want to rename is referenced by a
CHECKconstraint, the column name cannot be modified, and an error will be returned when theRENAME COLUMNoperation is executed.obclient> ALTER TABLE tbl12 RENAME COLUMN d TO e; ERROR 3959 (HY000): Check constraint 'd_check' uses column 'd', hence column cannot be dropped or renamed.If the column that you want to rename is referenced by a function-based index, the column name cannot be modified, and an error will be returned when the
RENAME COLUMNoperation is executed.DROP TABLE IF EXISTS tbl12; obclient> CREATE TABLE tbl12(i INT, INDEX ((i+1))); Query OK, 0 rows affected obclient> ALTER TABLE tbl12 RENAME COLUMN i TO j; ERROR 3837 (HY000): Column 'i' has a functional index dependency and cannot be dropped or renamed.If the column that you want to rename is referenced by a view, the
RENAME COLUMNoperation will succeed, but querying the view will return an error. You need to manually modify the view definition.obclient> CREATE TABLE tbl13(a INT); Query OK, 0 rows affected obclient> CREATE VIEW v1 AS SELECT a + 1 FROM tbl13; Query OK, 0 rows affected obclient> SELECT * FROM v1; Empty set obclient> ALTER TABLE tbl13 RENAME COLUMN a TO b; Query OK, 0 rows affected obclient> SELECT * FROM v1; ERROR 1356 (42S22): View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use themIf the column that you want to rename is referenced by a stored procedure, the
RENAME COLUMNoperation will succeed, but theCALLprocedure will return an error. You need to manually modify the stored procedure.obclient> CREATE TABLE tbl14(a INT); Query OK, 0 rows affected obclient> CREATE PROCEDURE proc() SELECT a + 1 FROM tbl14; Query OK, 0 rows affected obclient> CALL proc(); Empty set obclient> ALTER TABLE tbl14 RENAME COLUMN a TO b; Query OK, 0 rows affected obclient> CALL proc(); ERROR 1054 (42S22): Unknown column 'a' in 'field list'
Modify the columnstore attribute of a table
Run the following SQL statement to create a table named
tbl1.CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 VARCHAR(50));Change the table
tbl1to a rowstore and columnstore redundant table, and then delete the rowstore and columnstore redundant attributes.ALTER TABLE tbl1 ADD COLUMN GROUP(all columns, each column);ALTER TABLE tbl1 DROP COLUMN GROUP(all columns, each column);Change the table
tbl1to a columnstore table, and then delete the columnstore attribute.ALTER TABLE tbl1 ADD COLUMN GROUP(each column);ALTER TABLE tbl1 DROP COLUMN GROUP(each column);
Modify the Skip Index attribute of a column
Run the following SQL statement to create a table named test_skidx.
CREATE TABLE test_skidx(
col1 INT SKIP_INDEX(MIN_MAX, SUM),
col2 FLOAT SKIP_INDEX(MIN_MAX),
col3 VARCHAR(1024) SKIP_INDEX(MIN_MAX),
col4 CHAR(10)
);
Change the Skip Index attribute of column
col2in thetest_skidxtable to theSUMSkip Index type.ALTER TABLE test_skidx MODIFY COLUMN col2 FLOAT SKIP_INDEX(SUM);Add the Skip Index attribute to a new column in the
test_skidxtable. Add theMIN_MAXSkip Index type to columncol4in thetest_skidxtable.ALTER TABLE test_skidx MODIFY COLUMN col4 CHAR(10) SKIP_INDEX(MIN_MAX);Delete the Skip Index attribute of a column in the
test_skidxtable. Delete the Skip Index attribute of columncol1in thetest_skidxtable.ALTER TABLE test_skidx MODIFY COLUMN col1 INT SKIP_INDEX();or
ALTER TABLE test_skidx MODIFY COLUMN col1 INT;
Modify the table attribute
Disable the persistent macroblock-level Bloom filter for the tb table.
ALTER TABLE tb SET enable_macro_block_bloom_filter = False;
Modify the STORAGE_CACHE_POLICY at the table level
Change the hot cache of the
tbl1table to be automatically identified by the system.ALTER TABLE tbl1 SET STORAGE_CACHE_POLICY (GLOBAL = "auto");Change the data in the
tbl2table to be hot data that is within two months of the current time, based on thecol3column.ALTER TABLE tbl2 SET STORAGE_CACHE_POLICY (BOUNDARY_COLUMN = col3, HOT_RETENTION = 2 MONTH);
Modify the STORAGE_CACHE_POLICY at the partition level
Add a partition named p2 to the
tbl3table. The hot data in partition p2 that needs to be cached to the local disk is automatically identified by the system.ALTER TABLE tbl3 ADD PARTITION (PARTITION p2 VALUES LESS THAN(300) STORAGE_CACHE_POLICY = "auto");Change the data in the existing partition p1 of the
tbl3table to hot data.ALTER TABLE tbl3 ALTER PARTITION p1 STORAGE_CACHE_POLICY = 'hot';Change the data in the subpartition sp3 of the
tbl4table to hot data that needs to be cached to the local disk. This data is automatically identified by the system.ALTER TABLE tbl4 ALTER SUBPARTITON sp3 STORAGE_CACHE_POLICY = 'auto';
