Purpose
This statement is used to modify the structure of an existing table, such as modifying the table and its properties, adding columns, modifying columns and their properties, 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' # Deprecated from 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, including generated columns. |
| [FIRST | BEFORE | AFTER column_name] | Specifies the position of the added column as the first column of the table or before/after the column_name column. At present, OceanBase Database only supports setting the position of a column in the ADD COLUMN syntax. |
| CHANGE [COLUMN] | Modifies the column name and column definition. It supports only extending the length of specific character data types, such as VARCHAR, VARBINARY, and CHAR. |
| 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.
NoticeYou cannot drop a primary key column. |
| ADD FOREIGN KEY | Adds a foreign key. If you do not specify a foreign key name, the system automatically generates a foreign key name in the format of table name + OBFK + creation time (for example, t1_OBFK_1627747200000000 for a foreign key created on t1 at 00:00:00 on August 1, 2021). A foreign key allows cross-referencing data across tables. When you perform an UPDATE or DELETE operation on the parent table and the key value matches a row in the child table, the result depends on the ON UPDATE and ON DELETE clauses of the reference operation:
SET DEFAULT operation. |
| ADD PRIMARY KEY | Adds a primary key. You can specify one or more columns as a 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 whether the index is visible. If the index is INVISIBLE, the SQL optimizer will not select it. |
| key_part | Creates a function index. |
| index_col_name | Specifies the column name of the index. After each column name, you can specify ASC (ascending) but not DESC (descending). By default, the index is created in ascending order. The index is created in the following order: first, the values of the first column in index_col_name are sorted; then, the values of the next column are sorted for records with the same value in the first column; and so on. |
| expr | Specifies a valid function index expression, which can be a boolean expression, such as c1=c1.Notice In the current version of OceanBase Database, you cannot 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, try to avoid active transactions or queries on the partition. Otherwise, an error may occur or an unexpected situation may arise. |
| TRUNCATE {PARTITION | SUBPARTITION} | Drops data in a partition:
Notice When you drop data in a partition, try to avoid active transactions or queries on the partition. Otherwise, an error may occur or an unexpected situation may arise. |
| RENAME COLUMN old_col_name [TO|AS] new_col_name | Modifies the column name without changing the column definition.
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-compatible 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. Supported operations:
|
| [NOT] ENFORCED | Specifies whether to enforce the CHECK constraint with the specified name constraint_name.
|
| ADD COLUMN GROUP([all columns, ]each column) [DELAYED] | Converts the table to a columnar table. For more information, see the following list:
|
| DROP COLUMN GROUP([all columns, ]each column) | Removes the storage format of the table. For more information, see the following list:
|
| index_column_group_option | Specifies the index options. For more information, see the following list:
|
| SKIP_INDEX | Modifies the Skip Index attribute of a column. Valid values:
Notice
|
| EXCHANGE PARTITION partition_name WITH TABLE origin_table_name | Specifies a partition exchange. In this command, partition_name specifies the partition name 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 | Optional. Specifies the major compaction threshold and strategy, which control the behavior of major compactions after data is dumped. For more information about the values, see table_mode_value. |
| AUTO_INCREMENT_CACHE_SIZE | Specifies the number of cached auto-increment values. The default value is 0, which indicates that this parameter is not configured. In this case, the tenant-level parameter auto_increment_cache_size is used as the cache size for auto-increment columns. |
| READ {ONLY | WRITE} | Specifies the read/write permission of the table. Valid values:
|
| DUPLICATE_SCOPE | Modifies the duplicate table attribute. Valid values:
|
| enable_macro_block_bloom_filter [=] {True | False} | Specifies whether to persist the bloom filter at the macro block level. Valid values:
|
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list) | Modifies the dynamic partition management attribute of the table. dynamic_partition_policy_list specifies the list of configurable parameters of the dynamic partition strategy. The parameters are separated by commas. For more information about the parameters, see dynamic_partition_policy_option. |
| REORGANIZE PARTITION | Used to manually split a partition. The following parameters are related to this procedure:
NoticeIn OceanBase Database in MySQL-compatible mode, the current version only supports splitting a single partition into multiple partitions. It does not support splitting multiple partitions into multiple partitions. |
| PARTITION BY | Used to modify the automatic partitioning attributes or the partitioning rules of a table. The following parameters are related to this procedure:
|
| MODIFY PARTITION partition_name ADD SUBPARTITION (add_subpartition_option) | Used to add a subpartition.
NoticeAdding a subpartition is not supported for partitions of the HASH or KEY type. |
| add_subpartition_option | Specifies the definition of the added subpartition. |
| range_partition_expr | Specifies the RANGE/RANGE COLUMNS partitioning expression. |
| list_partition_expr | Specifies the LIST/LIST COLUMNS partitioning expression. |
| FORCE | Used to drop obsolete columns.
NoteWhen certain 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 the obsolete columns. |
| SEMISTRUCT_ENCODING_TYPE | Optional. Specifies the type of semistructured encoding. Valid values:
NoticeStarting from OceanBase Database V4.4.1, the |
| SEMISTRUCT_PROPERTIES | Optional. Specifies the type of semistructured encoding in the form of key-value pairs. Valid values:
For more information about how to use semistructured encoding, see Use semistructured encoding. NoticeThis parameter is supported starting from OceanBase Database 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
In the following list of TABLE_MODE modes, all modes except NORMAL represent QUEUING tables. This QUEUING table is the most basic table type, and the following modes (except for the NORMAL mode) represent more aggressive compaction strategies.
NORMAL: The default value, indicating normal mode. 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: Indicates moderate mode. In this mode, the probability of triggering a major compaction after a data dump is moderate.SUPER: Indicates super mode. In this mode, the probability of triggering a major compaction after a data dump is high.EXTREME: Indicates extreme mode. In this mode, the probability of triggering a major compaction after a data dump is high.
For more information about major compactions, see Adaptive major compaction.
tokenizer_option
SPACE: The default value, indicating that the tokenizer splits text by spaces. You can specify the following properties:Property Value Range min_token_size [1, 16] max_token_size [10, 84] NGRAM: Indicates the N-Gram tokenizer for Chinese text. You can specify the following properties:Property Value Range ngram_token_size [1, 10] NGRAM2: Indicates the tokenizer that splits text into continuous characters in the range ofmin_ngram_sizetomax_ngram_size. You can specify the following properties:Property Value Range min_ngram_size [1, 16] max_ngram_size [1, 16] BENG: Indicates the Beng tokenizer for basic English text. You can specify the following properties:Property Value Range min_token_size [1, 16] max_token_size [10, 84] IK: Indicates the IK tokenizer for Chinese text. Currently, only theutf-8character set is supported. You can specify the following property:Property Value Range ik_mode smartmax_word
You can use the TOKENIZE function to view the tokenization result of text in the specified tokenizer and JSON format.
parser_properties
min_token_size: The minimum token length. The default value is 3, and the value range is 1 to 16.max_token_size: The maximum token length. The default value is 84, and the value range is 10 to 84.ngram_token_size: The token length for theNGRAMtokenizer. This property is valid only for theNGRAMtokenizer. The default value is 2, and the value range is 1 to 10.ik_mode: The tokenization mode for theIKtokenizer. Valid values:smart: The default value. This mode uses the dictionary to improve tokenization accuracy and prioritizes dictionary boundaries, which may reduce unnecessary expansions.max_word: This mode recognizes the words defined in the dictionary but does not affect the maximum expansion of tokenization. Even if the dictionary defines words, themax_wordmode still tries to split the text into more words.
min_ngram_size: The minimum token length. The value range is [1,16].max_ngram_size: The maximum token length. The value range is [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. Indicates that dynamic partition management is enabled.false: Indicates that 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. Indicates that no partitions are precreated.0: Indicates that only the current partition is precreated.n {hour | day | week | month | year}: Indicates the time span for precreating partitions. For example,3 hourindicates that partitions for the last 3 hours are precreated.
Note
- When multiple partitions are to be precreated, the intervals between the partition boundaries are
TIME_UNIT. - The first precreated partition boundary is the ceiling of the existing maximum partition boundary in
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 bounds are < now() - expire_time are deleted. Valid values:-1: The default value. Indicates that partitions never expire.0: Indicates that all partitions except the current one are expired.n {hour | day | week | month | year}: Indicates the partition expiration time. For example,1 dayindicates that partitions expire after 1 day.
For more information about modifying 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
The storage_cache_policy_option defines different attributes in the Key-Value format. The semantics of each attribute are as follows:
GLOBAL = {"hot" | "auto"| "none"}: specifies the hot cache strategy for all data in the 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 for this index follows the value ofSTORAGE_CACHE_POLICYin the main table.Notice
The
noneattribute can only be used for indexes.
timeline_strategy_list: specifies the list of time axis strategy parameters, with parameters 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 according to the configured strategy.Note
A time axis is defined based on the partition range values. Hot data is cached in the partition when it meets certain time conditions. When using the time axis strategy, note the following:
- Only Range-partitioned tables (Range partitions can be at the primary or secondary level) are supported, because time is required to determine whether the data has expired. Double Range partitions are not supported, as it is unclear which Range partition's time to use.
- When using the time axis strategy, the partition expression can only contain column names and does not support expression conversion. For example,
PARTITION BY RANGE COLUMNS(expr(col3))is not supported. BOUNDARY_COLUMNmust be a partitioning key. If the partitioning key consists of multiple columns,BOUNDARY_COLUMNmust be the first column to determine whether the partition has expired.
BOUNDARY_COLUMN = column_name: specifies the column used to determine hot data. Supported data types include integer types (BIGINTorINT, formatted as Unix timestamps) and time types (TIMESTAMP,DATE,DATETIME, orYEAR).- If
BOUNDARY_COLUMNis an integer type, the table can be partitioned using the Range or Range Columns method. - If
BOUNDARY_COLUMNis a time type, the table can only be partitioned using the Range Columns method.
- If
BOUNDARY_COLUMN_UNIT = {"s" | "ms"}: specifies the time unit for theBOUNDARY_COLUMNparameter. This parameter can only be set whenBOUNDARY_COLUMNis an integer type. When an integer value is used as a timestamp, the timestamp unit must be specified to avoid incorrect parsing. Valid values:If the partition column is of type
INT,BOUNDARY_COLUMN_UNITcan only be set tos.If the partition column is of type
BIGINT,BOUNDARY_COLUMN_UNITcan be set to eithersorms.Notice
If the format is not a Unix timestamp, the system cannot correctly recognize the time represented by the
INTtype.
HOT_RETENTION = intnum retention_time_unit: specifies the time range for hot data.intnum: specifies an integer.retention_time_unit: specifies the time unit. Valid values:YEAR: specifies years.MONTH: specifies months.WEEK: specifies weeks.DAY: specifies days.HOUR: specifies hours.MINUTE: specifies minutes.
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 specified 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 specified partition is automatically identified by the system.none: the default value, indicating that the strategy for this partition follows the value ofSTORAGE_CACHE_POLICYin the main table.
Examples
Add and drop columns
Create a sample table 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 in thetbl1table toc3and 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 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 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 foreign key constraint
fk1to 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 foreign key constraint
fk1from 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 the
ind3index on thetbl2table, referencing thec1andc2columns.obclient> ALTER TABLE tbl2 ADD INDEX ind3 (c1,c2); Query OK, 0 row affectedYou can use 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.
Create three function indexes on the
t1_functable. One of them is namedi2, and the other two are automatically generated by the system with names in the format offunctional_indexplus 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.
Use the following SQL statement to create the
tbl3table.CREATE TABLE tbl3 (col1 INT, col2 VARCHAR(50));Create the columnstore index
idx1_tbl3on thetbl3table, referencing thecol1column.ALTER TABLE tbl3 ADD INDEX idx1_tbl3 (col1) WITH COLUMN GROUP(each column);
Set 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 the
idx1_tbl4index.CREATE INDEX idx1_tbl4 ON tbl4(col2);Set the
idx1_tbl4index to invisible.ALTER TABLE tbl4 ALTER INDEX idx1_tbl4 INVISIBLE;View the structure of the
tbl4table again.SHOW CREATE TABLE tbl4;The returned 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 the
M202006partition to 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')) );
Modify the parallelism
Set 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 modify the parallelism of a table, you can also use thePARALLELhint. The syntax is as follows:alter /*+ parallel(int) */ table.
Operations related to column types
Change the 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 a primary key
col1to 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 affectedDrop the
CHECKconstraint from thetbl7table.obclient> ALTER TABLE tbl7 DROP CHECK my_check; Query OK, 0 rows affectedChange 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 a
not nullconstraint to it at a time. You cannot rename multiple columns or add anot nullconstraint to multiple columns. - You can add only a
not nullconstraint. - You can perform only the
alter_columnoperation. You cannot create indexes or partitions. - The column to be renamed and the column to which the
not nullconstraint is added 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 a
not nullconstraint. - You can perform only the
alter_columnoperation. You cannot create indexes or partitions. - You cannot modify other columns except the two columns to which
not nullconstraints are added.
Execute the following statement 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 that of the target column are the same.
Execute the following statement 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 statement 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 rule
Execute the following statement 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 statement 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 statement to query the
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTSsystem table and obtain the update and delete rules of the foreign key constraintfk_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 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 COLUMNstatement does not modify the column definition. It only changes the column name. If the target name already exists in the table, theRENAME COLUMNstatement will return an error. However, renaming the column to its original name will not return an error.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 to be renamed, the
RENAME COLUMNstatement 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 to be renamed is referenced by a prefix index, the
RENAME COLUMNstatement 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 to be renamed, the
RENAME COLUMNstatement 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:
The column to be renamed is referenced by a generated list expression. Modifying the column name is not supported, and an error will be returned when the
RENAME COLUMNstatement 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 dependencyThe column to be renamed is referenced by a partitioning expression. Modifying the column name is not supported, and an error will be returned when the
RENAME COLUMNstatement 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.The column to be renamed is referenced by a
CHECKconstraint. Modifying the column name is not supported, and an error will be returned when theRENAME COLUMNstatement 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.The column to be renamed is referenced by a function-based index. Modifying the column name is not supported, and an error will be returned when the
RENAME COLUMNstatement 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.The column to be renamed is referenced by a view. The
RENAME COLUMNstatement is executed successfully, but an error will be returned when querying the view. 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 themThe column to be renamed is referenced by a stored procedure. The
RENAME COLUMNstatement is executed successfully, but an error will be returned when calling the stored procedure. 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-columnstore redundant table and then delete the rowstore-columnstore redundant attribute.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)
);
Run the following statement to 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);Run the following statement to add the
MIN_MAXSkip Index type to columncol4in thetest_skidxtable.ALTER TABLE test_skidx MODIFY COLUMN col4 CHAR(10) SKIP_INDEX(MIN_MAX);Run the following statement to delete the Skip Index attribute of column
col1in 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
Run the following statement to set the hot cache of the
tbl1table to be automatically identified by the system.ALTER TABLE tbl1 SET STORAGE_CACHE_POLICY (GLOBAL = "auto");Run the following statement to set the data in partitions of the
tbl2table that are within 2 months of the current time based on thecol3column as hot data.ALTER TABLE tbl2 SET STORAGE_CACHE_POLICY (BOUNDARY_COLUMN = col3, HOT_RETENTION = 2 MONTH);
Modify the STORAGE_CACHE_POLICY at the partition level
Run the following statement to add a partition named p2 to the
tbl3table and set the hot data in the partition to be automatically identified by the system.ALTER TABLE tbl3 ADD PARTITION (PARTITION p2 VALUES LESS THAN(300) STORAGE_CACHE_POLICY = "auto");Run the following statement to set the data in the existing partition p1 of the
tbl3table as hot data.ALTER TABLE tbl3 ALTER PARTITION p1 STORAGE_CACHE_POLICY = 'hot';Run the following statement to set the data in the subpartition sp3 of the
tbl4table to be automatically identified by the system.ALTER TABLE tbl4 ALTER SUBPARTITON sp3 STORAGE_CACHE_POLICY = 'auto';