03_GBase 8a MPP Cluster 数据库开发推荐
引用:GBase 8a MPP Cluster SQL基础,DDL-数据库和表管理
一、标识符命名规则
数据库、表、列和别名等对象的名称都称为标识符。
| 标识符 | 最大长度(字符) | 允许的字符 |
|---|---|---|
| 数据库 | 48 | a~z、A~Z、0~9、下划线、必须以字母或下划线开头 |
| 表、视图 | 56 | a~z、A~Z、0~9、下划线、必须以字母或下划线开头 |
| 列 | 64 | a~z、A~Z、0~9、下划线、“-”、必须以字母或下划线开头 |
| 别名 | 255 | a~z、A~Z、0~9、下划线、中文、必须以字母或下划线开头 |
| 存储过程 | 64 | a~z、A~Z、0~9、下划线、必须以字母或下划线开头 |
| 变量 | a~z、A~Z、0~9、下划线、必须以字母或下划线开头 |
限制:
1、数据库、表和列名不应以空格结尾。
2、如果标识符是一个限制词或包含特殊字符,必须用反引号引用它,如:SELECT * FROM 'select'.id >100。
3、如果标识符超过最大长度限制,数据库、表、列、视图、存储过程的命令将报错,而别名将会截断至256个字符进行显示。
4、当库名、表名、列名为中文时,最大支持的汉字个数:库名48个汉字;表名21个汉字;参数gcluster_extend_ident设置为1,即开启创建中文库名,表名、列名的功能,默认为0,不开启。
二、列的引用
允许名称由一个或多个标识符组成。各个组成部分应该用因为句号"."隔开,列的引用不能产生二义性。
| 列引用 | 含义 |
|---|---|
| col_name | 列col_name 来自查询所用的任何一个表中对应字段。 |
| Table_name.col_name | 列col_name 来自当前数据库中的表table_name。 |
| DB_name.table_name.col_name | 列col_name 来自数据库DB_name中的表table_name。 |
| VC_name.db_name.table_name.col_name | 列col_name 来自虚拟集群VC_name数据库db_name中的表table_name。 |
| ‘col_name’ | 反引号包围,该字段是一个关键词或包含特殊字符。 |
限制:
1、含有关键词和特殊字符的标识符,不能直接组合一个整体来引用。‘gs_table‘.’gs_column’合法,'gs_table.gs_column'不合法。
三、SQL注释语法
支持单行注释和多行注释
3.1 单行注释
“#” 如:SELECT * FROM BK_TRAN; #This comment continues to the END of line;
“--” 如: SELECT * FROM BK_TRAN; --This comment continues to the END of line;
3.2 多行注释
注释多行 如:‘“/注释内容/”
注释行中间的内容 如:SELECT 1+/*this is a multiple-line comment*/1 FROM DUAL;
四、用户变量
用户变量的生命周期是会话级的,即对其他会话不可见。当用户退出时,此用户的所有用户变量会自动释放。
1、用户变量以@开头,不区分大小写:@var_name
2、通过SET 语法来定义并为变量赋值:SET @var_name = expr[,@var_name = expr]...
3、通过SELECT语法查看用户变量的值:SELECT @var_name[,@var_name]...
五、数据类型
| 数据分类 | 数据类型 |
|---|---|
| 数值型 | INTEGER、TINYINT、SMALLINT、BIGINT、DECIMAL、NUMERIC、FLOAT、DOUBLE |
| 字符型 | CHAR、VARCHAR、TEXT |
| 日期和时间类型 | DATE、TIME、DATETIME、TIMESTAMP |
| 二进制类型 | BLOB、LONGBLOB |
5.1 数值类型
| 类型名称 | 最小值 | 最大值 | 占用字节 |
|---|---|---|---|
| TINYINT | -127 | 127 | 1 |
| SMALLINT | -32767 | 32767 | 2 |
| INT(INTEGER) | -2147483647 | 2147483647 | 4 |
| BIGINT | -9223372036854775806 | 9223372036854775806 | 8 |
| DECIMAL((M[,D])) | -(1E+M-1)/(1E+D) | (1E+M-1)/(1E+D) | 动态计算 |
| FLOAT | -3.40E+38 | 3.40E+38 | 4 |
| DOUBLE | -1.7976931348623157E+308 | 1.7976931348623157E+308 | 8 |
近似数据类型:FLOAT、DOUBLE
DECIMAL(M,D)类型,M是总位数(最大65位),D是小数点后的位数,默认是DECIMAL(10,0)
5.2 字符类型
| 类型名称 | 最大长度(字符) | 说明 |
|---|---|---|
| CHAR | 255 | 定长 |
| VARCHAR | 10922(utf8)、16383(gbk) | 变长 |
| TEXT | 10922 | 变长 |
限制:
1、生产中不建议使用CHAR和TEXT类型,CHAR类型长度255,定长。
2、TEXT类型不能指定DEFAULT值,仅兼容使用。
5.3 日期时间类型
| 类型名称 | 最小值 | 最大值 | 格式 |
|---|---|---|---|
| DATE | 0001-01-01 | 9999-12-31 | YYYY-MM-DD |
| DATETIME | 0001-01-01 00:00:00.000000 | 9999-12-31 23:59:59 | YYYY-MM-DD HH:MI:SS.ffffff |
| TIME | -838:59:59 | 838:59:59 | HHH:MI:SS |
| TIMESTAMP | 1970-01-01 08:00:01 | 2038-01-01 00:59:59 | YYYY-MM-DD HH:MI:SS |
限制:
DATETIME精确到微秒,TIMESTAMP仅兼容使用,区间有限制,生产不建议使用,务必注意。
5.4 二进制类型
| 类型名称 | 最大长度(字符) |
|---|---|
| BLOB | 32k |
| LONGBLOB | 64M |
限制:
1、创建表时,二进制类型列不能有DEFAULT值。
2、查询语句中,二进制类型列不建议用在过滤条件、group by、join条件中。
3、查询语句中,二进制类型不支持OLAP函数。
4、二进制类型列不能创建HASH索引和HASH分布列。
六、数据模型设计原则
6.1 HASH分布表
大表建成分布表,推荐建成hash分布表。选取分布列(distributed by)字段的原则:
1、在多表join查询时,表中某列经常用于JOIN等值关联。
2、表中该列通常是等值查询的列,并且使用的频率很高。
3、做group by 操作时,分组字段。
4、表中重复值较小的列,尽量让数据均匀分布。
限制:
1、当前只支持INT、BIGINT、VARCHAR、DECIMAL数据类型。
2、distributed by 列的值,不允许进行update操作。#重点注意
6.2 复制表
复制表会存在各个节点上,即表的名字和数据完全一致。在OceanBase中,复制表要求强一致性读取(强同步),在任意一个健康节点的副本上读取到数据的最新修改。
个人推荐是类似参数表,表规模小但高并发读、低频写的表。
6.3 修改表的限制
1、不支持该表的字符集。
2、不支持改变列的属性(NOT NULL、默认值)。
3、不支持改变列的数据类型。
4、VARCHAR类型可改变列的长度,只能变大,不能变小。
修改字段类型的方法:
增加新的列 -> update新列的值 -> 移动新列至指定位置 -> 老列重命名 -> 新列重命名 -> 删除老列
示例:修改表中old列类型由float(18,6)修改为decimal(26,6)
1、alter table tablename add column new decimal(26,6);
2、update tablename set new = old;
3、alter table tablename modify new decimal(26,6) after old;
4、alter table tablename change old bbb float(18,6);
5、alter table tablename change new old decimal(26,6);
6、alter table tablename drop column bbb;
热门帖子
- 12025-12-01浏览数:182763
- 22023-05-09浏览数:25057
- 42023-09-25浏览数:18525
- 52020-05-11浏览数:17528