8.1.2.1. OceanBase-Mysql
8.1.2.1.1. 创建表
语法
CREATE [GLOBAL TEMPORARY] TABLE table_name
(table_definition_list) [partition_option] [on_commit_option]
CREATE [GLOBAL TEMPORARY] TABLE table_name
(table_definition_list) [partition_option] [AS] select;
table_definition_list:
table_definition [, table_definition ...]
table_definition:
column_definition
| INDEX [index_name] index_desc
| [CONSTRAINT [constraint_name]] [UNIQUE] (column_definition_list) [USING INDEX index_option_list]
| [CONSTRAINT [constraint_name]] FOREIGN KEY (column_name, column_name ...) references_clause constraint_state
| [CONSTRAINT [constraint_name]] CHECK(expression) constraint_state
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name data_type
[VISIBLE|INVISIBLE]
{
[DEFAULT expression]
[NULL | NOT NULL]
[CONSTRAINT [constraint_name] [PRIMARY] KEY] [UNIQUE [KEY]]
[CONSTRAINT [constraint_name] CHECK(expression)]
[CONSTRAINT [constraint_name] references_clause]
|
[GENERATED ALWAYS] AS (expression) [VIRTUAL]
[NULL | NOT NULL] [UNIQUE KEY] [[PRIMARY] KEY] [UNIQUE LOWER_KEY] [COMMENT string]
}
references_clause:
REFERENCES table_name [ (column_name, column_name ...) ] [ON DELETE {CASCADE}]
index_desc:
(column_desc_list) [index_option_list]
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [ASC | DESC][NULL LAST | NULL FIRST]
partition_option:
PARTITION BY HASH(column_name_list)
[subpartition_option] hash_partition_define
| PARTITION BY RANGE (column_name_list)
[subpartition_option] (range_partition_list)
| PARTITION BY LIST (column_name_list)
[subpartition_option] (list_partition_list)
on_commit_option:
ON COMMIT DELETE ROWS
| ON COMMIT PRESERVE ROWS
- 描述
- 该语句用来在数据库中创建一张新表,DEFAULT expression可支持使用相关日期时间函数、字符串、常数。
示例
-- 转换前Oracle SQL:
CREATE TABLE t1ss(id int PRIMARY KEY ,
col1 timestamp(6) DEFAULT current_timestamp ,
col2 timestamp(6) DEFAULT sysdate,
col3 date DEFAULT current_timestamp ,
col4 date DEFAULT sysdate,
col5 timestamp(6) DEFAULT systimestamp
);
-- 转换后OceanBase-MySQL:
CREATE TABLE t1ss (id bigint PRIMARY KEY,col1 timestamp(6) DEFAULT current_timestamp(6),col2 timestamp(6) DEFAULT current_timestamp(6),col3 datetime DEFAULT current_timestamp(0),col4 datetime DEFAULT current_timestamp(0),col5 timestamp(6) DEFAULT current_timestamp(6));
警告
针对 OceanBase-MySQL-4.2.1 相关版本:
创建表的列的默认表达式支持范围
支持以下写法:
timestamp(n)/data default current_timestamp
timestamp(n)/data default sysdate
timestamp(n) default systimestamp转换到目标库后,默认值函数的精度会根据列精度
n自动调整。 需要注意,可能与源库Oracle中的时间精度存在差异。
- 表列默认值如果是函数或表达式,转换后会直接去除,导致没有默认值功能,DML时需要指定列值:
date,timestamp 类型,若默认值为current_date,current_timestamp,sysdate,localtimestamp 则不去除
to_char函数去除,支持TO_CHAR毫秒’FF6’格式,被用于insert、update、select场景
- char类型支持有如下规制:
char不带精度或者带精度,但精度范围在1到256,不转换
char带精度,精度范围在256到2000,转换成varchar类型,并带上相同的精度
char超过2000,报错
- PARTITION BY RANGE时,若分区建为number类型的整型(小数为0),会转换为int或bigint 类型
precision <= 9类型转换为int10 <= precision <=18类型转换为bigintprecision > 18报错
DEFAULT expression, expression支持被小括号包裹
DEFAULT expression, 如果该列的类型是number(n,0), 则支持格式为 yyyy-mm-dd 和 yyyy/mm/dd 的表达式, yyyy, mm, dd 必须是正整数
列类型为number, 且未指定精度,则转换为 decimal(38)
列类型为rowid, 则转换为 char(18)
8.1.2.1.2. 创建索引
语法
CREAT INDEX index_name on table_name(index_expr [, index_expr ] ...)
index_expr: column_name | function
- 描述
创建索引
示例
-- 创建表
create index i_key1_1 on t1(key1);
create index i_key1_1 on t1(to_number(key1));
-- 转换后OceanBase-MySQL:
CREATE INDEX i_key1_1 ON t1 (key1);
CREATE INDEX i_key1_1 ON t1 ((CAST(key1 AS DECIMAL(65, 30))));