Purpose
This statement creates a new table in the database.
Syntax
CREATE [hint_options] [TEMPORARY] TABLE [IF NOT EXISTS] table_name
(table_definition_list) [table_option_list] [partition_option] [[MERGE_ENGINE = {delete_insert | partial_update}] table_column_group_option] [IGNORE | REPLACE] [AS] select;
CREATE TABLE [TEMPORARY] [IF NOT EXISTS] table_name
LIKE table_name;
table_definition_list:
table_definition [, table_definition ...]
table_definition:
column_definition_list
| [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
| [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY}
[index_name] index_desc
| [CONSTRAINT [constraint_name]] FOREIGN KEY
[index_name] index_desc
REFERENCES reference_definition
[match_action][opt_reference_option_list]
| [FULLTEXT] {INDEX | KEY} [index_name] [index_type] (key_part,...) [WITH PARSER tokenizer_option] [PARSER_PROPERTIES[=](parser_properties_list)]
[index_option_list] [index_column_group_option]
| index_json_clause
| [CONSTRAINT [constraint_name]] CHECK(expression) constranit_state
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)]
| column_name data_type
[GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]
[opt_generated_column_attribute]
skip_index_option_list:
skip_index_option [,skip_index_option ...]
skip_index_option:
MIN_MAX
| SUM
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}
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
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)
table_option_list:
table_option [ table_option ...]
table_option:
[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| table_tablegroup
| block_size
| lob_inrow_threshold [=] num
| compression
| AUTO_INCREMENT [=] INT_VALUE
| COMMENT string_value
| ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|DEFAULT
| PCTFREE [=] num
| parallel_clause
| DUPLICATE_SCOPE [=] 'none|cluster'
| TABLE_MODE [=] 'table_mode_value'
| auto_increment_cache_size [=] INT_VALUE
| READ {ONLY | WRITE}
| ORGANIZATION [=] {INDEX | HEAP}
| enable_macro_block_bloom_filter [=] {True | False}
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list)
| SEMISTRUCT_ENCODING_TYPE [=] 'encoding' # Deprecated since V4.4.1. Use SEMISTRUCT_PROPERTIES instead.
| MICRO_BLOCK_FORMAT_VERSION [=] {1|2}
| 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}
| TIME_UNIT = {'hour' | 'day' | 'week' | 'month' | 'year'}
| PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}
| TIME_ZONE = {'default' | 'time_zone'}
| BIGINT_PRECISION = {'none' | 'us' | 'ms' | 's'}
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) [STORAGE_CACHE_POLICY = {"hot" | "auto" | "none"}]
| PARTITION BY LIST {(expression) | COLUMNS (column_name_list)}
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE [COLUMNS]([column_name_list]) [SIZE('size_value')] (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 = {"hot" | "auto" | "none"}]
| SUBPARTITION BY LIST(expression)
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
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
table_column_group_option/index_column_group_option:
WITH COLUMN GROUP(all columns)
| WITH COLUMN GROUP(each column)
| WITH COLUMN GROUP(all columns, each column)
index_json_clause:
[UNIQUE] INDEX idx_json_name((CAST(json_column_name->'$.json_field_name' AS UNSIGNED ARRAY)))
| INDEX idx_json_name(column_name, [column_name, ...] (CAST(json_column_name->'$.json_field_name' AS CHAR(n) ARRAY)))
Parameters
| Parameter | Description |
|---|---|
| hint_options | Optional. Specifies the hint options. You can manually specify the bypass import hint, including APPEND, DIRECT, and NO_DIRECT. The corresponding hint format is /*+ [APPEND | DIRECT(need_sort,max_error,load_type)] parallel(N) |NO_DIRECT */. For more information about bypass importing data by using the CREATE TABLE AS SELECT statement, see the Use the CREATE TABLE AS SELECT statement to bypass import data section in Full bypass import. |
| TEMPORARY | Optional. Indicates that the table is a temporary table.
NoteThis parameter is supported starting from OceanBase Database V4.4.2. |
| IF NOT EXISTS | If you specify IF NOT EXISTS, an error will not be returned even if the table to be created already exists. If you do not specify this option and the table to be created already exists, an error will be returned. |
| IGNORE | REPLACE | Optional. Specifies how to handle rows with duplicate unique key values when you use the CREATE TABLE ... SELECT statement. If you do not specify IGNORE or REPLACE, an error will be returned when there are rows with duplicate unique key values.
|
| PRIMARY KEY | Specifies the primary key of the table to be created. If you do not specify this option, a hidden primary key will be used. OceanBase Database allows you to modify the primary key of a table or add a primary key to a table by using the ALTER TABLE statement. For more information, see ALTER TABLE. |
| FOREIGN KEY | Specifies the foreign key of the table to be created. If you do not specify the foreign key name, it will be named as the table name + OBFK + the creation time. (For example, the foreign key name created on 2021-08-01 00:00:00 for the t1 table is t1_OBFK_1627747200000000.) A foreign key allows cross-table referencing of related data. When UPDATE or DELETE operations affect the key values in the parent table that match the rows in the child table, the result depends on the ON UPDATE and ON DELETE clauses:
SET DEFAULT operation is supported. |
| FULLTEXT | Optional. Specifies whether to create a full-text index. For more information, see the Create a full-text index section in Create an index.
NoticeCurrently, only local full-text indexes are supported. |
| WITH PARSER tokenizer_option | Optional. Specifies the tokenizer for the full-text index. For more information, see tokenizer_option below. |
| PARSER_PROPERTIES[=](parser_properties_list) | Optional. Specifies the properties of the tokenizer. For more information, see parser_properties below. |
| KEY | INDEX | Specifies the key or index of the table to be created. If you do not specify the index name, it will be named as the first column referenced by the index. If the name is duplicated, it will be named with an underscore ( _) and a sequence number. (For example, if the index created on the c1 column is named repeatedly, it will be named c1_2.) You can execute the SHOW INDEX statement to view the indexes on a table. |
| key_part | Creates (function) indexes. |
| index_col_name | Specifies the column name of the index. You can specify ASC (ascending) after each column name, but not DESC (descending). The default is ascending. The sorting method for creating indexes is: first, sort by the value of the first column in index_col_name; then, sort by the value of the next column name if the values of the first column are the same; and so on. |
| expr | Specifies a valid function index expression, which can be a boolean expression, for example, c1=c1.
NoticeOceanBase Database does not allow you to create function indexes on generated columns. |
| ROW_FORMAT | Specifies whether to enable the Encoding storage format.
|
| [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] | Creates a generated column. expr specifies the expression used to calculate the column value.
|
| BLOCK_SIZE | Specifies the microblock size of the table. |
| lob_inrow_threshold | Specifies the INROW threshold for LOB fields. If the size of a LOB field exceeds this threshold, the excess data will be stored in the OUTROW format in the LOB meta table. The default value is controlled by the variable ob_default_lob_inrow_threshold. |
| COMPRESSION | Specifies the compression algorithm for the table. Valid values:
|
| CHARSET | CHARACTER SET | Specifies the default character set for columns in the table. For more information about the supported character sets, see Character sets. |
| COLLATE | Specifies the default collation for columns in the table. For more information about the supported collations, see Collations. |
| table_tablegroup | Specifies the tablegroup to which the table belongs. |
| AUTO_INCREMENT | Specifies the initial value of the auto-increment column in the table. OceanBase Database supports using an auto-increment column as a partitioning key. |
| COMMENT | A comment. Not case-sensitive. |
| PCTFREE | Specifies the percentage of space reserved in a macroblock. |
| parallel_clause | Specifies the parallelism level for the table:
|
| DUPLICATE_SCOPE | Specifies the replication attribute of the table. Valid values:
cluster level. |
| CHECK | Limits the range of values in a column.
SHOW CREATE TABLE statement.information_schema.TABLE_CONSTRAINTS view.information_schema.CHECK_CONSTRAINTS view. |
| constraint_name | The name of the constraint, which can contain up to 64 characters.
|
| expression | The constraint expression.
|
| MERGE_ENGINE = {delete_insert | partial_update} | Optional. Specifies the update model for the table. Valid values:
NoteOnce specified, the value of the |
| table_column_group_option/index_column_group_option | Specifies the columnar storage options for the table or index. The following table describes the options:
|
| SKIP_INDEX | Specifies the Skip Index attribute of a column. Valid values:
Notice
|
| index_json_clause | Specifies the clause for creating a multivalued index. For more information about multivalued indexes, see the Create a multivalued index section in Create an index.
NoticeThe multivalued index feature is currently in the experimental stage. We recommend that you do not use it in a production environment to avoid affecting system stability. |
| json_column_name | Specifies the name of the column of the JSON data type in the table. |
| idx_json_name | Specifies the name of the multivalued index to be created. |
| json_field_name | Specifies the name of the field in the JSON column for which an index is to be created. |
| TABLE_MODE | Optional. Specifies the merge trigger threshold and merge strategy, that is, the behavior of data compaction after data is dumped. For more information about the values, see table_mode_value below. |
| auto_increment_cache_size | Optional. 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 system uses the tenant-level parameter auto_increment_cache_size as the cache size for the auto-increment column. |
| READ {ONLY | WRITE} | Specifies the read/write permissions of the table. Valid values:
|
| ORGANIZATION [=] {INDEX | HEAP} | Optional. Specifies the storage order of data rows in the table, that is, the table organization mode. Valid values:
ORGANIZATION option, the value of the default_table_organization parameter is used. |
| enable_macro_block_bloom_filter [=] {True | False} | Specifies whether to persist the bloom filter at the macroblock level. Valid values:
|
| DYNAMIC_PARTITION_POLICY [=] (dynamic_partition_policy_list) | Optional. Specifies the dynamic partition management attribute of the table to enable automatic creation and deletion of partitions. dynamic_partition_policy_list specifies the configurable parameters of the dynamic partition strategy. Parameters are separated by commas. For more information about the parameters, see dynamic_partition_policy_option below. |
| PARTITION BY RANGE [COLUMNS]([column_name_list]) [SIZE('size_value')] | Optional. Specifies the clause for creating an auto-partitioned table. For more information, see the syntax for creating an auto-partitioned table in Automatic partition splitting. |
| SEMISTRUCT_ENCODING_TYPE | Optional. Specifies the encoding type of semistructured data. Valid values:
NoticeStarting from V4.4.1, |
| SEMISTRUCT_PROPERTIES | Optional. Specifies the encoding type of semistructured data in the key-value pair format. Valid values:
For more information about how to use semistructured encoding, see Use semistructured encoding. NoticeThis parameter is supported starting from V4.4.1. |
| MICRO_BLOCK_FORMAT_VERSION | Optional. Specifies the microblock storage format version of the table. Valid values: [1, +∞)
NoteThis parameter is introduced starting from V4.4.1. |
| STORAGE_CACHE_POLICY | Optional. Specifies the hot cache strategy for tables, partitions, and indexes in shared storage mode. This strategy caches the specified data from object storage to the local cloud disk. Otherwise, the system adaptively caches the data. For more information, see storage_cache_policy below. |
table_mode_value
Note
Among the listed TABLE_MODE modes, all modes except NORMAL represent QUEUING tables. The 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 a moderate mode. In this mode, the probability of triggering a major compaction after a data dump is moderate.SUPER: Indicates a super mode. In this mode, the probability of triggering a major compaction after a data dump is high.EXTREME: Indicates an 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 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 of length betweenmin_ngram_sizeandmax_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
parser_properties
min_token_size: The minimum token length. The default value is 3, and the value ranges from 1 to 16.max_token_size: The maximum token length. The default value is 84, and the value ranges from 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 ranges from 1 to 10.ik_mode: The tokenization mode for theIKtokenizer. Valid values:smart: The default value. The tokenizer uses the dictionary to improve tokenization accuracy. The boundaries of the dictionary words are prioritized, which may reduce unnecessary expansions.max_word: The tokenizer identifies the words defined in the dictionary but does not affect the maximum expansion of tokenization. Even if the dictionary defines the words, themax_wordmode still tries to split the text into more words.
min_ngram_size: The minimum token length. The value ranges from 1 to 16.max_ngram_size: The maximum token length. The value ranges from 1 to 16.
Here is an example:
CREATE TABLE tbl1 (col1 VARCHAR(200), col2 TEXT,
FULLTEXT INDEX fidx(col2) WITH PARSER ik PARSER_PROPERTIES=(ik_mode='max_word'));
dynamic_partition_policy_option
ENABLE = {true | false}: Optional. Indicates whether to enable dynamic partition management. This parameter can be modified. Valid values:true: The default value. Indicates to enable dynamic partition management.false: Indicates to disable dynamic partition management.
TIME_UNIT = {'hour' | 'day' | 'week' | 'month' | 'year'}: Required. Indicates the time unit for partitioning, that is, the interval for automatically creating partition boundaries. This parameter cannot be modified. Valid values:hour: Partitions are created by hour.day: Partitions are created by day.week: Partitions are created by week.month: Partitions are created by month.year: Partitions are created by year.
PRECREATE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}: Optional. Indicates the precreation time. When dynamic partition management is scheduled, partitions are precreated so that maximum partition upper bound > now() + precreate_time. This parameter can be modified. Valid values:-1: The default value. Indicates not to precreate partitions.0: Indicates to precreate only the current partition.n {hour | day | week | month | year}: Indicates the time span for precreation. For example,3 hourindicates to precreate partitions for the last 3 hours.
Note
- When multiple partitions are to be precreated, the interval between partition boundaries is
TIME_UNIT. - The boundary of the first precreated partition is the ceiling of the maximum existing partition boundary based on
TIME_UNIT.
EXPIRE_TIME = {'-1' | '0' | 'n {hour | day | week | month | year}'}: Optional. Indicates the partition expiration time. When dynamic partition management is scheduled, all partitions with upper bounds < now() - expire_time are deleted. This parameter can be modified. Valid values:-1: The default value. Indicates that partitions do not expire.0: Indicates that all partitions except the current one expire.n {hour | day | week | month | year}: Indicates the partition expiration time. For example,1 dayindicates that partitions expire after 1 day.
TIME_ZONE = {'default' | 'time_zone'}: Optional. Indicates the time zone for determining the current time and the size of the partitioning key of thedate,datetime, andyeartypes. This parameter cannot be modified. Valid values:default: The default value. Indicates not to configure a time zone and to use the tenant time zone. For types other thandate,datetime, andyear, thetime_zonefield must bedefault.time_zone: Indicates a custom time zone offset. For example,+8:00is a time zone offset.
BIGINT_PRECISION = {'none'| 'ms' | 's'}: Optional. Indicates the timestamp precision of thebiginttype partitioning key. This parameter cannot be modified. Valid values:none: The default value. Indicates no precision (the partitioning key is not of thebiginttype).ms: Indicates millisecond precision.s: Indicates second precision.
For more information about creating a dynamic partition table, see Create a dynamic partition table.
Here is an example:
CREATE TABLE tbl2 (col1 INT, col2 DATETIME)
DYNAMIC_PARTITION_POLICY(
ENABLE = true,
TIME_UNIT = 'hour',
PRECREATE_TIME = '3 hour',
EXPIRE_TIME = '1 day',
TIME_ZONE = '+8:00',
BIGINT_PRECISION = 'none')
PARTITION BY RANGE COLUMNS (col2)(
PARTITION P0 VALUES LESS THAN ('2024-11-11 13:30:00')
);
storage_cache_policy
Create a table-level storage_cache_policy
The STORAGE_CACHE_POLICY option is optional. If you do not specify this option, the default value of the tenant-level configuration parameter default_storage_cache_policy is used. The attributes in the storage_cache_policy_option parameter are defined in the Key-Value format. The semantics of each attribute are as follows:
GLOBAL = {"hot"|"auto"|"none"}: specifies the hot cache strategy for the full table data. Valid values:hot: specifies that all data in the table is hot data. If the cache disk space is sufficient, all data in the table will be cached to the local cache disk.auto: specifies that the hot data in the table is automatically identified by the system.none: specifies that the cache strategy for the index follows the value ofSTORAGE_CACHE_POLICYof the parent table.Notice
The
noneattribute can only be used 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 strategy specifies that hot data is cached based on the partition range defined by the Range partition. When a certain time condition is met, the data in the partition is determined to be hot data. When you use a time-axis strategy, note the following:
- Only Range-partitioned tables can use a time-axis strategy. A Range partition can be a primary or secondary partition, but a double Range partition cannot be used. This is because it is impossible to determine which Range partition to use for the time-axis strategy.
- When you use a time-axis strategy, the partition expression can contain only column names and cannot contain expressions. For example,
PARTITION BY RANGE COLUMNS(expr(col3))is invalid. BOUNDARY_COLUMNmust be a partitioning key. If the partitioning key contains multiple columns,BOUNDARY_COLUMNmust be the first column to determine whether the partition has expired.
BOUNDARY_COLUMN = column_name: specifies the column to determine hot data. The column can be an integer column of theBIGINTorINTtype, in the Unix timestamp format, or a time column of theTIMESTAMP,DATE,DATETIME, orYEARtype.If the
BOUNDARY_COLUMNis an integer column, the table can be partitioned by Range or Range Columns.If the
BOUNDARY_COLUMNis a time column, the table can be partitioned only by Range Columns.BOUNDARY_COLUMN_UNIT = {"s" | "ms"}: specifies the time unit of theBOUNDARY_COLUMNparameter. This parameter can be set only when theBOUNDARY_COLUMNis an integer column. When an integer value is used as a timestamp, you must specify the timestamp unit to avoid incorrect parsing of the timestamp. Valid values:If the partition column is of the
INTtype, theBOUNDARY_COLUMN_UNITcan be onlys.If the partition column is of the
BIGINTtype, theBOUNDARY_COLUMN_UNITcan besorms.Notice
If the format is not a Unix timestamp, the system cannot correctly identify 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.
Create a partition-level storage_cache_policy
The STORAGE_CACHE_POLICY option is optional for partitions. Valid values:
hot: specifies that all data in the partition is hot data. If the cache disk space is sufficient, all data in the partition will be cached to the local cache disk.auto: specifies that the hot data in the partition is automatically identified by the system.none: specifies that the hot cache strategy for the partition follows the value ofSTORAGE_CACHE_POLICYof the parent partition. This is the default value.
Examples
Create a database table.
obclient> CREATE TABLE tbl1 (c1 INT PRIMARY KEY, c2 VARCHAR(50)); Query OK, 0 rows affectedCreate a table with an index.
obclient> CREATE TABLE tbl2 (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX i1 (c2)); Query OK, 0 rows affectedCreate a table
tbl3with a function-based index.obclient> CREATE TABLE tbl3 (c1 INT, c2 INT, INDEX i1 ((c1+1)), UNIQUE KEY ((c1+c2))); Query OK, 0 rows affected obclient> SHOW CREATE TABLE tbl3; +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl3 | CREATE TABLE `tbl3` ( `c1` int(11) DEFAULT NULL, `c2` int(11) DEFAULT NULL, UNIQUE KEY `functional_index` ((`c1` + `c2`)) BLOCK_SIZE 16384 LOCAL, KEY `i1` ((`c1` + 1)) BLOCK_SIZE 16384 LOCAL ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 2 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+Create a table with 8 hash partitions.
obclient> CREATE TABLE tbl4 (c1 INT PRIMARY KEY, c2 INT) PARTITION BY HASH(c1) PARTITIONS 8; Query OK, 0 rows affectedCreate a table with range partitions as primary partitions and key partitions as subpartitions.
obclient> CREATE TABLE tbl5 (c1 INT, c2 INT, c3 INT) PARTITION BY RANGE(c1) SUBPARTITION BY KEY(c2, c3) SUBPARTITIONS 5 (PARTITION p0 VALUES LESS THAN(0), PARTITION p1 VALUES LESS THAN(100)); Query OK, 0 rows affectedCreate a table with one column of type
gbkand another column of typeutf8.obclient> CREATE TABLE tbl6 (c1 VARCHAR(10), c2 VARCHAR(10) CHARSET GBK COLLATE gbk_bin) DEFAULT CHARSET utf8 COLLATE utf8mb4_general_ci; Query OK, 0 rows affectedEnable encoding and use
zstdcompression. Set the space reserved for macroblocks to5%.obclient> CREATE TABLE tbl7 (c1 INT, c2 INT, c3 VARCHAR(64)) COMPRESSION 'zstd_1.0' ROW_FORMAT DYNAMIC PCTFREE 5; Query OK, 0 rows affectedCreate a table
tbl8and set the parallelism to3.obclient> CREATE TABLE tbl8(c1 INT PRIMARY KEY, c2 INT) PARALLEL 3; Query OK, 0 rows affectedUse an auto-increment column as the partitioning key.
obclient> CREATE TABLE tbl9(inv_id BIGINT NOT NULL AUTO_INCREMENT,c1 BIGINT, PRIMARY KEY (inv_id) ) PARTITION BY HASH(inv_id) PARTITIONS 8; Query OK, 0 rows affectedSpecify a foreign key for the
ref_t2table. When anUPDATEoperation affects the key values in the parent table that match the rows in the child table, execute theSET NULLoperation.obclient> CREATE TABLE ref_t1(c1 INT PRIMARY KEY, C2 INT); Query OK, 0 rows affected obclient> CREATE TABLE ref_t2(c1 INT PRIMARY KEY, C2 INT,FOREIGN KEY(c2) REFERENCES ref_t1(c1) ON UPDATE SET NULL); Query OK, 0 rows affectedCreate a table
tbl10with aCHECKconstraint and view the constraint information.obclient> CREATE TABLE tbl10 (col1 INT, col2 INT, col3 INT, CONSTRAINT equal_check1 CHECK(col1 = col3 * 2)); Query OK, 0 rows affected obclient> SHOW CREATE TABLE tbl10; +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl10 | CREATE TABLE `tbl10` ( `col1` int(11) DEFAULT NULL, `col2` int(11) DEFAULT NULL, `col3` int(11) DEFAULT NULL, CONSTRAINT `equal_check1` CHECK ((`col1` = (`col3` * 2))) ) 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 table
tbl11based on thetbl10table and view the table information.obclient> CREATE TABLE tbl11 LIKE tbl10; Query OK, 0 rows affected obclient> SHOW CREATE TABLE tbl11; +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tbl11 | CREATE TABLE `tbl11` ( `col1` int(11) DEFAULT NULL, `col2` int(11) DEFAULT NULL, `col3` int(11) DEFAULT NULL, CONSTRAINT `tbl11_OBCHECK_1650793233327894` CHECK ((`col1` = (`col3` * 2))) ) 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
cluster-level replicated tabledup_t1.Log in to the sys tenant and create a unit.
obclient> CREATE RESOURCE UNIT IF NOT EXISTS 2c5g MAX_CPU 2, MEMORY_SIZE '5G'; Query OK, 0 rows affectedCreate a resource pool with a unit number of 2.
obclient> CREATE RESOURCE POOL tenant_pool UNIT = '2c5g', UNIT_NUM = 2, ZONE_LIST = ('z1', 'z2', 'z3'); Query OK, 0 rows affectedCreate a user tenant
obmysqland specify its locality distribution.obclient> CREATE TENANT obmysql resource_pool_list=('tenant_pool'), LOCALITY = "F@z1, F@z2, R@z3", PRIMARY_ZONE = "z1" SET ob_tcp_invited_nodes='%'; Query OK, 0 rows affectedLog in to the
obmysqluser tenant created in step 3 and create a replicated table.obclient> USE test; Database changed obclient> CREATE TABLE dup_t1(c1 INT) DUPLICATE_SCOPE = 'cluster'; Query OK, 0 rows affected(Optional) View the broadcast log stream information. The replicated table will be created on this log stream.
obclient> SELECT * FROM oceanbase.DBA_OB_LS WHERE FLAG LIKE "%DUPLICATE%"; +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+-----------+ | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | UNIT_LIST | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+-----------+ | 1003 | NORMAL | z1;z2 | 0 | 0 | 1683267390195713284 | NULL | 1683337744205408139 | 1683337744205408139 | DUPLICATE | | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+-----------+ 1 row in set(Optional) View the replica distribution of the replicated table in the sys tenant. The
REPLICA_TYPEfield indicates the replica type.obclient> SELECT * FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TABLE_NAME = "dup_t1"; +-----------+---------------+------------+----------+------------+----------------+-------------------+------------+---------------+-----------+-------+------+----------------+----------+----------+--------------+-----------------+ | TENANT_ID | DATABASE_NAME | TABLE_NAME | TABLE_ID | TABLE_TYPE | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | DATA_TABLE_ID | TABLET_ID | LS_ID | ZONE | SVR_IP | SVR_PORT | ROLE | REPLICA_TYPE | DUPLICATE_SCOPE | +-----------+---------------+------------+----------+------------+----------------+-------------------+------------+---------------+-----------+-------+------+----------------+----------+----------+--------------+-----------------+ | 1002 | test | dup_t1 | 500002 | USER TABLE | NULL | NULL | NULL | NULL | 200001 | 1003 | z1 | 11.xxx.xxx.xxx | 36125 | LEADER | FULL | CLUSTER | | 1002 | test | dup_t1 | 500002 | USER TABLE | NULL | NULL | NULL | NULL | 200001 | 1003 | z1 | 11.xxx.xxx.xxx | 36124 | FOLLOWER | READONLY | CLUSTER | | 1002 | test | dup_t1 | 500002 | USER TABLE | NULL | NULL | NULL | NULL | 200001 | 1003 | z2 | 11.xxx.xxx.xxx | 36127 | FOLLOWER | FULL | CLUSTER | | 1002 | test | dup_t1 | 500002 | USER TABLE | NULL | NULL | NULL | NULL | 200001 | 1003 | z2 | 11.xxx.xxx.xxx | 36126 | FOLLOWER | READONLY | CLUSTER | | 1002 | test | dup_t1 | 500002 | USER TABLE | NULL | NULL | NULL | NULL | 200001 | 1003 | z3 | 11.xxx.xxx.xxx | 36128 | FOLLOWER | READONLY | CLUSTER | | 1002 | test | dup_t1 | 500002 | USER TABLE | NULL | NULL | NULL | NULL | 200001 | 1003 | z3 | 11.xxx.xxx.xxx | 36129 | FOLLOWER | READONLY | CLUSTER | +-----------+---------------+------------+----------+------------+----------------+-------------------+------------+---------------+-----------+-------+------+----------------+----------+----------+--------------+-----------------+ 6 rows in setInsert and read/write data in the replicated table like a regular table. For a read request, if you use a proxy, the read request may be routed to any OBServer node. If you connect directly to an OBServer node, the read request will be executed on the connected OBServer node as long as the local replica is readable.
obclient> INSERT INTO dup_t1 VALUES(1); Query OK, 1 row affected obclient> SELECT * FROM dup_t1; +------+ | c1 | +------+ | 1 | +------+ 1 row in set
Create a columnstore table
tbl1_cg.obclient> CREATE TABLE tbl1_cg (col1 INT PRIMARY KEY, col2 VARCHAR(50)) WITH COLUMN GROUP(each column);Create a table with a columnstore index.
obclient> CREATE TABLE tbl2_cg (col1 INT PRIMARY KEY, col2 INT, col3 INT, INDEX i1 (col2) WITH COLUMN GROUP(each column));Create a columnstore table with a columnstore index.
obclient> CREATE TABLE tbl3_cg (col1 INT PRIMARY KEY, col2 INT, col3 INT, INDEX i1 (col2) WITH COLUMN GROUP(each column)) WITH COLUMN GROUP(each column);Specify the Skip Index attribute for a column when creating a table.
obclient> 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) );Create a table
tbl1with an integer columncol1and specify that the operation uses 5 parallel threads. Also, specify that the data in the new tabletbl1will be sourced from the query results of tabletbl2.obclient> CREATE /*+ parallel(5) */ TABLE tbl1 (col1 INT) AS SELECT col1 FROM tbl2;Create a table
tbwith a persistent bloom filter at the macroblock level.obclient> CREATE TABLE tb(c1 INT PRIMARY KEY, c2 INT) enable_macro_block_bloom_filter = True;Create a table
tbl1and specify the semi-structured encoding type asencodingand the frequency threshold as90.obclient> CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 INT) SEMISTRUCT_PROPERTIES=(ENCODING_TYPE=ENCODING, FREQ_THRESHOLD=90);Create a table
tband enable the new Flat row storage format (version 2).obclient> CREATE TABLE tb(c1 INT PRIMARY KEY, c2 INT) micro_block_format_version = 2;
Create a table-level STORAGE_CACHE_POLICY
Manually specify hot data.
CREATE TABLE test_table1 (c1 INT, c2 INT) storage_cache_policy (global = "hot");Specify hot data by time axis.
CREATE TABLE test_part_func_expr ( id INT, event_time DATETIME NOT NULL, data VARCHAR(100)) STORAGE_CACHE_POLICY ( BOUNDARY_COLUMN = event_time, HOT_RETENTION =1 YEAR ) PARTITION BY RANGE COLUMNS(`event_time`) ( PARTITION p_prev3h VALUES LESS THAN ("2018-01-01 00:00:00"), PARTITION p_prev2h VALUES LESS THAN ("2019-01-01 00:00:00"), PARTITION p_prev1h VALUES LESS THAN ("2020-01-01 00:00:00"), PARTITION p_current VALUES LESS THAN ("2021-01-01 00:00:00"), PARTITION p_next1h VALUES LESS THAN ("2022-01-01 00:00:00"), PARTITION p_max VALUES LESS THAN MAXVALUE );
Create a partition-level STORAGE_CACHE_POLICY
Specify the STORAGE_CACHE_POLICY for primary partitions when creating a partitioned table.
CREATE TABLE tbl3 (col1 INT, col2 INT, col3 INT) PARTITION BY RANGE(col1) SUBPARTITION BY KEY(col2, col3) SUBPARTITIONS 5 (PARTITION p0 VALUES LESS THAN(0) STORAGE_CACHE_POLICY = "hot", PARTITION p1 VALUES LESS THAN(100) STORAGE_CACHE_POLICY = "auto" );Specify the STORAGE_CACHE_POLICY for subpartitions when creating a partitioned table.
CREATE TABLE tbl4 (col1 INT, col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) (PARTITION p0 VALUES LESS THAN(100) (SUBPARTITION sp0 VALUES LESS THAN(2020) STORAGE_CACHE_POLICY = "hot", SUBPARTITION sp1 VALUES LESS THAN(2021)), PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION sp2 VALUES LESS THAN(2020), SUBPARTITION sp3 VALUES LESS THAN(2021) STORAGE_CACHE_POLICY = "hot", SUBPARTITION sp4 VALUES LESS THAN(2022)) );Specify the STORAGE_CACHE_POLICY for both indexes and partitions when creating a table.
CREATE TABLE tbl5 ( c1 INT, c2 VARCHAR(50), INDEX idx1 (c1) STORAGE_CACHE_POLICY = (GLOBAL = "hot"), INDEX idx2 (c2) STORAGE_CACHE_POLICY = (GLOBAL = "auto") ) PARTITION BY RANGE (c1) (PARTITION p1 VALUES LESS THAN (100) STORAGE_CACHE_POLICY = "hot", PARTITION p2 VALUES LESS THAN (200) STORAGE_CACHE_POLICY = "auto", PARTITION p3 VALUES LESS THAN MAXVALUE STORAGE_CACHE_POLICY = "none");Example explanation:
- When creating the
tbl5table, two indexes are created, each with a different storage cache policy. - The table is partitioned by the
c1column using range partitioning, with each partition having a different storage cache policy. - The STORAGE_CACHE_POLICY for indexes and partitions can be independently set, allowing for fine-grained storage management.
- When creating the