管理表

在阅读本文档之前请先阅读 数据模型.

GreptimeDB 通过 SQL 提供了表管理的功能,下面通过 MySQL Command-Line Client 来演示它。

以下部分更详细的关于 SQL 语法的解释,请参考 SQL reference

创建数据库

默认的数据库是 public,可以手动创建一个数据库。

sql

  1. CREATE DATABASE test;

sql

  1. Query OK, 1 row affected (0.05 sec)

列出所有现有的数据库。

sql

  1. SHOW DATABASES;

sql

  1. +---------+
  2. | Schemas |
  3. +---------+
  4. | test |
  5. | public |
  6. +---------+
  7. 2 rows in set (0.00 sec)

使用 like 语法:

sql

  1. SHOW DATABASES LIKE 'p%';

sql

  1. +---------+
  2. | Schemas |
  3. +---------+
  4. | public |
  5. +---------+
  6. 1 row in set (0.00 sec)

然后更改数据库:

sql

  1. USE test;

更改回 public 数据库:

sql

  1. USE public;

创建表

NOTE

注意:GreptimeDB 提供了一种 schemaless 方法来写入数据,不需要使用额外的协议手动创建表。参见 自动生成表结构**。

如果您有特殊需要,仍然可以通过 SQL 手动创建表。假设我们想要创建一个名为 monitor 的表,其数据模型如下:

  • host 是独立机器的主机名,是 Tag 列,用于在查询时过滤数据。
  • ts 是收集数据的时间,是 Timestamp 列。它也可以在查询数据时用作时间范围的过滤器。
  • cpumemory 是机器的 CPU 利用率和内存利用率,是包含实际数据且未索引的 Field 列。

创建表的 SQL 代码如下。在 SQL 中,我们使用 PRIMARY KEY 来指定 Tag,使用 TIME INDEX 来指定 Timestamp 列,其余列是 Field

sql

  1. CREATE TABLE monitor (
  2. host STRING,
  3. ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP TIME INDEX,
  4. cpu DOUBLE DEFAULT 0,
  5. memory DOUBLE,
  6. PRIMARY KEY(host)) ENGINE=mito WITH(regions=1);

sql

  1. Query OK, 0 row affected (0.03 sec)

NOTE

GreptimeDB 目前不支持在创建表后更改已有列的数据模型。 因此,在创建表之前,仔细设计数据模型非常重要。

CREATE TABLE 语法

  • 时间戳列:GreptimeDB 是一个时序数据库系统,在创建表时,必须用 TIME INDEX 关键字明确指定时间序列的列。 时间序列的列的数据类型必须是 TIMESTAMP
  • 主键:Primary key指定的主键列类似于其他时序系统中的 Tag,比如 InfluxDB。 主键和时间戳列用于唯一地定义一条时间线,这类似于其他时间序列系统中的时间线的概念,如 InfluxDB
  • 表选项:当创建一个表时,可以指定一组表选项,点击这里了解更多细节。

描述表

显示表的详细信息:

sql

  1. DESC TABLE monitor;

sql

  1. +--------+----------------------+------+------+---------------------+---------------+
  2. | Column | Type | Key | Null | Default | Semantic Type |
  3. +--------+----------------------+------+------+---------------------+---------------+
  4. | host | String | PRI | YES | | TAG |
  5. | ts | TimestampMillisecond | PRI | NO | current_timestamp() | TIMESTAMP |
  6. | cpu | Float64 | | YES | 0 | FIELD |
  7. | memory | Float64 | | YES | | FIELD |
  8. +--------+----------------------+------+------+---------------------+---------------+
  9. 4 rows in set (0.01 sec)

Semantic Type 列描述了表的数据模型。hostTag 列,tsTimestamp 列,cpumemoryField 列。

列出现有的表

可以使用 show tables 语句来列出现有的表

sql

  1. SHOW TABLES;

sql

  1. +------------+
  2. | Tables |
  3. +------------+
  4. | monitor |
  5. | scripts |
  6. +------------+
  7. 3 rows in set (0.00 sec)

注意:scripts 表是一个内置的表,用于存放用户定义的函数(UDF)。

其目前只支持表名的过滤,可以通过表名字对其进行过滤。

sql

  1. SHOW TABLES LIKE monitor;

sql

  1. +---------+
  2. | Tables |
  3. +---------+
  4. | monitor |
  5. +---------+
  6. 1 row in set (0.00 sec)

列出其他数据库中的表:

sql

  1. SHOW TABLES FROM test;

sql

  1. +---------+
  2. | Tables |
  3. +---------+
  4. | monitor |
  5. +---------+
  6. 1 row in set (0.01 sec)

改动表

可以像在 MySQL 数据库中一样,改变现有表的模式

sql

  1. ALTER TABLE monitor ADD COLUMN label VARCHAR;

sql

  1. Query OK, 0 rows affected (0.03 sec)

sql

  1. ALTER TABLE monitor DROP COLUMN label;

sql

  1. Query OK, 0 rows affected (0.03 sec)

注意:目前只允许添加/删除列,将很快支持改变列的定义。

删除表

DROP TABLE [db.]table 用于删除 db 或当前正在使用的数据库中的表。

删除当前数据库中的表 test

sql

  1. DROP TABLE monitor;

sql

  1. Query OK, 1 row affected (0.01 sec)

HTTP API

使用以下代码,通过 POST 方法创建一个表:

shell

  1. curl -X POST \
  2. -H 'authorization: Basic {{authorization if exists}}' \
  3. -H 'Content-Type: application/x-www-form-urlencoded' \
  4. -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)' \
  5. http://localhost:4000/v1/sql?db=public

json

  1. { "code": 0, "output": [{ "affectedrows": 1 }], "execution_time_ms": 10 }

关于 SQL HTTP 请求的更多信息,请参考 API 文档