管理表
在阅读本文档之前请先阅读 数据模型.
GreptimeDB 通过 SQL 提供了表管理的功能,下面通过 MySQL Command-Line Client 来演示它。
创建数据库
默认的数据库是 public
,可以手动创建一个数据库。
sql
CREATE DATABASE test;
sql
Query OK, 1 row affected (0.05 sec)
列出所有现有的数据库。
sql
SHOW DATABASES;
sql
+---------+
| Schemas |
+---------+
| test |
| public |
+---------+
2 rows in set (0.00 sec)
使用 like
语法:
sql
SHOW DATABASES LIKE 'p%';
sql
+---------+
| Schemas |
+---------+
| public |
+---------+
1 row in set (0.00 sec)
然后更改数据库:
sql
USE test;
更改回 public
数据库:
sql
USE public;
创建表
NOTE
注意:GreptimeDB 提供了一种 schemaless 方法来写入数据,不需要使用额外的协议手动创建表。参见 自动生成表结构**。
如果您有特殊需要,仍然可以通过 SQL 手动创建表。假设我们想要创建一个名为 monitor
的表,其数据模型如下:
host
是独立机器的主机名,是Tag
列,用于在查询时过滤数据。ts
是收集数据的时间,是Timestamp
列。它也可以在查询数据时用作时间范围的过滤器。cpu
和memory
是机器的 CPU 利用率和内存利用率,是包含实际数据且未索引的Field
列。
创建表的 SQL 代码如下。在 SQL 中,我们使用 PRIMARY KEY 来指定 Tag
,使用 TIME INDEX
来指定 Timestamp
列,其余列是 Field
。
sql
CREATE TABLE monitor (
host STRING,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP TIME INDEX,
cpu DOUBLE DEFAULT 0,
memory DOUBLE,
PRIMARY KEY(host)) ENGINE=mito WITH(regions=1);
sql
Query OK, 0 row affected (0.03 sec)
NOTE
GreptimeDB 目前不支持在创建表后更改已有列的数据模型。 因此,在创建表之前,仔细设计数据模型非常重要。
CREATE TABLE
语法
- 时间戳列:GreptimeDB 是一个时序数据库系统,在创建表时,必须用
TIME INDEX
关键字明确指定时间序列的列。 时间序列的列的数据类型可以是BIGINT
或TIMESTAMP
。如果选择BIGINT
,该列的插入值将被自动转换为以毫秒为单位的时间戳。 - 主键:主键用于唯一地定义一系列的数据,这类似于其他时间序列系统中的标签。如 InfluxDB。
描述表
显示表的详细信息:
sql
DESC TABLE monitor;
sql
+--------+----------------------+------+------+---------------------+---------------+
| Column | Type | Key | Null | Default | Semantic Type |
+--------+----------------------+------+------+---------------------+---------------+
| host | String | PRI | YES | | TAG |
| ts | TimestampMillisecond | PRI | NO | current_timestamp() | TIMESTAMP |
| cpu | Float64 | | YES | 0 | FIELD |
| memory | Float64 | | YES | | FIELD |
+--------+----------------------+------+------+---------------------+---------------+
4 rows in set (0.01 sec)
Semantic Type 列描述了表的数据模型。host
是 Tag
列,ts
是 Timestamp
列,cpu
和 memory
是 Field
列。
列出现有的表
可以使用 show tables
语句来列出现有的表
sql
SHOW TABLES;
sql
+------------+
| Tables |
+------------+
| monitor |
| scripts |
+------------+
3 rows in set (0.00 sec)
注意:scripts
表是一个内置的表,用于存放用户定义的函数(UDF)。
其目前只支持表名的过滤,可以通过表名字对其进行过滤。
sql
SHOW TABLES LIKE monitor;
sql
+---------+
| Tables |
+---------+
| monitor |
+---------+
1 row in set (0.00 sec)
列出其他数据库中的表:
sql
SHOW TABLES FROM test;
sql
+---------+
| Tables |
+---------+
| monitor |
+---------+
1 row in set (0.01 sec)
改动表
可以像在 MySQL 数据库中一样,改变现有表的模式
sql
ALTER TABLE monitor ADD COLUMN label VARCHAR;
sql
Query OK, 0 rows affected (0.03 sec)
sql
ALTER TABLE monitor DROP COLUMN label;
sql
Query OK, 0 rows affected (0.03 sec)
注意:目前只允许添加/删除列,将很快支持改变列的定义。
删除表
DROP TABLE [db.]table
用于删除 db
或当前正在使用的数据库中的表。
删除当前数据库中的表 test
:
sql
DROP TABLE monitor;
sql
Query OK, 1 row affected (0.01 sec)
HTTP API
使用以下代码,通过 POST 方法创建一个表:
shell
curl -X POST \
-H 'authorization: Basic {{authorization if exists}}' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'sql=CREATE TABLE monitor (host STRING, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, cpu DOUBLE DEFAULT 0, memory DOUBLE, TIME INDEX (ts), PRIMARY KEY(host)) ENGINE=mito WITH(regions=1)' \
http://localhost:4000/v1/sql?db=public
json
{ "code": 0, "output": [{ "affectedrows": 1 }], "execution_time_ms": 10 }
关于 SQL HTTP 请求的更多信息,请参考 API 文档。