Skip to content

数据库管理

创建数据库

sql
CREATE DATABASE [IF NOT EXISTS] <name>

删除数据库

sql
DROP DATABASE [IF EXISTS] <name>

使用数据库

sql
USE <databaseName>

该语句存在会话隔离,当前会话不影响其他会话

使用数据库后,不加数据库名称可查询当前数据库下的表,不可查询属于其他数据库的表:

> USE db1;
> SHOW TABLES;
| tableName | 
| --------- |
|   tbl1    |

> USE db2;
> SHOW TABLES;
| tableName |
| --------- |
|   tbl2    |

> USE db1;
> SELECT ... FROM [db1.]tbl1 ... 
正常输出结果

> SELECT ... FROM tbl2 ...
tbl2 not exists in db1

> SELECT ... FROM db2.tbl2 ...
正常输出结果

建表语句

sql
CREATE TABLE [IF NOT EXISTS] [db.]<table_name> (
 <field_name> <data_type> [NOT NULL] [DEFAULT <defaultValue>] [KEYCOL] [TIMECOL] [TIMERELEVANTACCURACY <'time_unit'>] [COMMENT <'commentContent'>],
    ...
) [table_options_list]

table_options_list:
  table_option[, table_option]

table_option:
  optionKey | optionKey = optionValue

说明:

  • db: 数据库名称

    • 如果 SQL 中传入 database name,且 database name 在系统中已经存在,表将建立在该数据库中。

    • 如果 SQL 中未传入 database name,将会使用当前使用中的 database name,表将建立在当前使用的数据库中。

    • 如果仍未指定当前使用的数据库,表将建立在默认数据库 (db) 中。

    • 指定当前使用的数据库:

      • web: 更换 database 选择框。

      • jdk: 使用连接字符串或显式使用 USE 语句。

      • cli: 使用 USE 语句或在配置文件中指定 Database。

    • 如果 SQL 中传入的 database name 在系统中不存在则会返回错误。

  • table_name:表名

    • 只可以包含英文字母、下划线、阿拉伯数字,并且必须以英文字母开头,并且不能以 _rt 结尾
  • field_name:字段名

    • 只可以包含英文字母、下划线、阿拉伯数字,并且必须以英文字母开头

    • 语法: UnicodeLetter (UnicodeLetter | '_' | UnicodeNumber)*

    • 示例: vin, create_time, SORT_NUM123

  • data_type:数据类型

  • NOT NULL:非空约束

  • defaultValue:默认值,时间类型默认值用字符串表示,例如:'1970-01-01 08:00:00',数组类型默认值用数组表示,例如:[1, 2, 3]

  • KEYCOL:该关键字标识当前列为 key 列,数据表必须有一个 key 列

  • TIMECOL:该关键字标识当前列为时间列,数据表必须有一个时间列

  • TIMERELEVANTACCURACY:该关键字标识当前列是时间相关的列,其中 time_unit 为时间单位,可取的值有:s、ms、us、m,分别表示秒、毫秒、微秒、分

  • commentContent:备注信息

  • table_options_list: 当前表的配置信息

    • metatable: 是否是配置表

      • 配置表:可以没有 KeyColTimeCol

      • 数据表:必须要有 KeyColTimeCol

    • dataSpace: 数据表的数据空间大小

      单位为字节,可选单位[b/B, k/K, m/M, g/G],默认单位为 M,也可以直接写数字 N,表示 N(M),如果不设置或值小于等于 0,则不限制

    • memorySpace: 数据表的内存空间大小

      单位为字节,可选单位[b/B, k/K, m/M, g/G],默认单位为 M,也可以直接写数字 N,表示 N(M),如果不设置或值小于等于 0,则不限制

    • fillTime: 数据表是否支持填充时间

      如果设置为 true,则写入 memcache 时,如果时间列为空,系统将补上当前时间,精确到秒

    • enableTimeslots: 是否启用时间槽

      如果设置为 true,则同一个 key 在同一个时间只能有一条数据,可以在 UI 中配置替换规则

  • CREATE TABLE 语句定义中:

    • 大写的关键字可忽略大小写 (例如:CREATETABLE 等可写为 createtable)

    • data_type 可忽略大小写 (VtBool,VTBOOL,vtbool 等价)

    • table_options 的 optionKey 可忽略大小写 (dataSpace,dataspace,DATASPACE 等价)

    • 时间相关列的单位可忽略大小写 ('s', 'S', 'ms', 'MS')

    • 其余字段不忽略大小写 (table_name, field_name, optionValue, defaultValue, commentContent)

例子:

sql
CREATE TABLE kudu_all_type (
    vt_bool VtBool DEFAULT false,
    vt_int8 VtInt8 DEFAULT 0,
    vt_int16 VtInt16 DEFAULT 0,
    vt_int32 VtInt32 DEFAULT 0,
    vt_int64 VtInt64 DEFAULT 0,
    vt_float VtFloat32 DEFAULT 0.0,
    vt_float32 VtFloat32 DEFAULT 0.0,
    vt_double VtFloat64 DEFAULT 0.0,
    vt_float64 VtFloat64 DEFAULT 0.0,
    vt_date_time VtDateTime DEFAULT '1970-01-01 08:00:00',
    vt_string VtString,
    vt_binary VtBinary,
    vt_object VtBinary,
    vt_map VtBinary,
    vt_structure VtBinary,
    vt_slice VtBinary,
    vt_array VtBinary,
    vt_bool_array VtBoolArray,
    vt_int8_array VtInt8Array,
    vt_int16_array VtInt16Array,
    vt_int32_array VtInt32Array,
    vt_int64_array VtInt64Array,
    vt_float_array VtFloatArray,
    vt_double_array VtDoubleArray,
    vt_date_time_array VtDateTimeArray,
    vt_string_array VtStringArray,
    vt_binary_array VtBinaryArray,
    vin VtString KeyCol,
    e_t VtInt64 DEFAULT 0 TimeRelevantAccuracy 's',
    e_t_date VtDateTime DEFAULT '1970-01-01 08:00:00' TimeCol,
    sort_num VtInt64 DEFAULT 0
) dataSpace = 1M, memorySpace = 1024, fillTime = true

在上述建表语句中,我们创建了一个名为 kudu_all_type 的数据表,包含 vt_* 的普通列,以及 vin 为主键列(KeyCol),e_t_date 为时间列(TimeCol),e_t 为时间相关列,精度为秒,存储的值为 e_t_dateint64 形式。
配置了两个配置项,dataSpace 为 1M,memorySpace 为 1024M,表示数据表的数据空间为 1M,内存空间为 1024M。

sql
CREATE TABLE vehicle_all_type (
    vt_bool VtBool DEFAULT false,
    vt_int8 VtInt8 DEFAULT 0,
    vt_int16 VtInt16 DEFAULT 0,
    vt_int32 VtInt32 DEFAULT 0,
    vt_int64 VtInt64 DEFAULT 0,
    vt_float VtFloat32 DEFAULT 0.0,
    vt_float32 VtFloat32 DEFAULT 0.0,
    vt_double VtFloat64 DEFAULT 0.0,
    vt_float64 VtFloat64 DEFAULT 0.0,
    vt_date_time VtDateTime DEFAULT '1970-01-01 08:00:00',
    vt_string VtString,
    vt_binary VtBinary,
    vt_object VtBinary,
    vt_map VtBinary,
    vt_structure VtBinary,
    vt_slice VtBinary,
    vt_array VtBinary,
    vt_bool_array VtBoolArray,
    vt_int8_array VtInt8Array,
    vt_int16_array VtInt16Array,
    vt_int32_array VtInt32Array,
    vt_int64_array VtInt64Array,
    vt_float_array VtFloatArray,
    vt_double_array VtDoubleArray,
    vt_date_time_array VtDateTimeArray,
    vt_string_array VtStringArray,
    vt_binary_array VtBinaryArray,
    vin VtString,
    create_time VtDateTime DEFAULT '1970-01-01 08:00:00',
    sort_num VtInt64 DEFAULT 0
)  Metatable

在上述建表语句中,我们创建了一个名为 vehicle_all_type 的配置表,包含 vt_* 的普通列,以及 vincreate_timesort_num

改表语句

sql
-- 新增列 field_name
ALTER TABLE <table_name> 
ADD COLUMN <field_name> <data_type> [NOT NULL] [DEFAULT <defaultValue>] [TIMERELEVANTACCURACY <'time_unit'>] [COMMENT <'commentContent'>]

-- 修改列 field_name
ALTER TABLE <table_name>
MODIFY COLUMN <field_name> <data_type> [NOT NULL] [DEFAULT <defaultValue>] [TIMERELEVANTACCURACY <'time_unit'>] [COMMENT <'commentContent'>]

-- 删除列 field_name
ALTER TABLE <table_name>
DROP COLUMN <field_name>

-- 重命名列 field_name 为 new_field_name
ALTER TABLE <table_name>
RENAME COLUMN <field_name> TO <new_field_name>

-- 更新表 Option
ALTER TABLE <table_name>
<table_option_list>

table_options_list:
  table_option[, table_option]

table_option:
  optionKey | optionKey = optionValue

说明:

  • key 列和时间列是不能增加和修改的

  • 修改类型支持同类型从小范围改到大范围,例如由 VtInt8 改为 VtInt32,不支持改为不同类型

  • optionKey 当前支持:

    • DataSpace: 标识该表占用的最大磁盘空间,其值为带单位或不带单位的数字,例如:100G、102400,可选的单位有:B、K、M、G,非正整数表示改为无限制。默认单位为 M,即 DataSpace=N 表示 N(M),如果不设置或值小于等于 0,则不限制,仅对 数据表) 生效

    • MemorySpace: 标识该表最大可使用的内存空间,其值为带单位或不带单位的数字,例如:100G、102400,可选的单位有:B、K、M、G,非正整数表示改为无限制,默认单位为 M,即 MemorySpace=N 表示 N(M),如果不设置或值小于等于 0,则不限制,仅对 数据表 生效

    • DateSpace: 标识该表保存数据的天数,如果不设置或值小于等于 0,则不限制,仅对 数据表) 生效

    • SpaceOption: 标识 dataSpace 和 dateSpace 的关系,可选值有:AND、OR,AND 表示 DataSpace 和 DateSpace 都满足时才会删除数据,OR 表示 DataSpace 和 DateSpace 满足一个即会删除数据,不填默认为 OR,仅对 数据表) 生效

    • SpaceHook: 删除多余数据的脚本,例如:rm -ef,仅对 数据表 生效

    • EnableTimeslot: 标识该表是否启用时间槽,值为 true 或 false,true 表示启用时间槽,false 表示不启用时间槽;不填为 false,只填写 optionKey 为 true,仅对 数据表 生效

    • FillTime: 标识该表在未传入时间 (时间列为空时),自动使用当前服务器时间填充,填充的时间精度为秒,如果传入的时间列不为空就不再填充 (仅对 数据表) 生效)

例子:

sql
ALTER TABLE vehicle_all_type 
    ADD COLUMN add_test3 VtInt8 DEFAULT 0
    RENAME COLUMN vt_binary_array TO vt_ba, 
    DROP COLUMN vt_double, 
    MODIFY COLUMN vt_int32 VtInt64 DEFAULT 0;

在上述 SQL 中,我们修改了表 vehicle_all_type

  1. 增加列 add_test3,类型为 VtInt8,默认值为 0
  2. 重命名列 vt_binary_arrayvt_ba
  3. 删除列 vt_double
  4. 修改列 vt_int32 的类型为 VtInt64,默认值为 0
sql
ALTER TABLE vehicle_all_type 
dataSpace = 1M, memorySpace = 1k;

修改表 vehicle_all_type 的数据空间大小为 1M,内存空间大小为 1K

将表 dataSpace 从 1M 改回无限制的方式为可以设置 dataSpace = -1

sql
ALTER TABLE vehicle_all_type
dataSpace = -1

删表语句

sql
DROP TABLE [IF EXISTS] <table_name>

说明:

  • 只会删除表结构,不会删除数据
  • 没有 IF EXISTS 关键字时,如果表不存在,则会报错

例子:

sql
DROP TABLE vehicle_all_type

查看表结构

sql
SHOW COLUMNS FROM [db_name.]<table_name> [FROM <db_name>]
ID(VtInt32)Name(VtString)Type(VtInt8)NotNull(VtBool)DefaultValue(VtString)Remarks(VtString)KeyCol(VtBool)TimeCol(VtBool)TimeRelevant(VtBool)RelevantAccuracy(VtInt8)GenerateTime(VtInt32)
1IsArray7true0falsefalsefalse01693900930
2Quality7true0falsefalsefalse01693900930
3TagValue7true0falsefalsefalse01693900930
4UaDataType7true0falsefalsefalse01693900930
5TagStringValue9truefalsefalsefalse01693900930
6HostNameTag9truetruefalsefalse01693900930
7e_date8true2000-01-01 00:00:00falsetruefalse01693900930

查看表 DDL

语法

sql
SHOW CREATE TABLE [db.]<table_name>
text
db > SHOW CREATE TABLE dsc;
+-----------------+--------------------------------------------------------------------+
| Table(VtString) | Create Table(VtString)                                             |
|       dsc       | CREATE TABLE db.dsc (                                              |
|                 |     asd VtDateTime NOT NULL DEFAULT '1970-01-01 08:00:00' TIMECOL, |
|                 |     dss VtString NOT NULL DEFAULT '' KEYCOL                        |
|                 | );                                                                 |
+-----------------+--------------------------------------------------------------------+