CREATE
CREATE 用于创建新的数据库或者表。
CREATE DATABASE
Syntax
创建新数据库:
CREATE DATABASE [IF NOT EXISTS] db_name [WITH <options>]
如果 db_name 数据库已经存在,CREATE 语句的行为如下:
- 不会创建新的数据库。
- 当
IF NOT EXISTS子句被指定时,不会返回错误。 - 否则,返回错误。
数据库也可以通过使用 WITH 关键字配置与 CREATE TABLE 语句类似的选项。数据库支持以下选项:
ttl- 数据库中所有表的数据存活时间(不能设置为instant)memtable.type- 内存表类型(time_series、partition_tree)append_mode- 数据库中的表是否为仅追加模式(true/false)merge_mode- 合并重复行的策略(last_row、last_non_null)skip_wal- 是否为数据库中的表禁用预写日志('true'/'false')compaction.*- 压缩相关设置(如compaction.type、compaction.twcs.time_window)
阅读更多关于表选项的信息。
数据库选项的行为有所不同:
-
TTL:此选项具有持续影响。没有指定 TTL 的表会持续继承这个数据库级别的值。更改数据库 TTL 会立即影响所有没有明确自行设置 TTL 的表。
-
其他选项(
memtable.type、append_mode、merge_mode、skip_wal、compaction.*):这些选项充当模板变量,仅在创建新表时应用。更改这些数据库级别的选项不会影响已存在的表——它们仅作为新创建表的默认值。
在创建表时,如果未提供相应的表选项,将使用在数据库级别配置的选项或者默认值。
示例
创建名为 test 的数据库:
CREATE DATABASE test;
Query OK, 1 row affected (0.05 sec)
使用 IF NOT EXISTS 再次创建:
CREATE DATABASE IF NOT EXISTS test;
创建一个具有 7 天 TTL(数据存活时间)的数据库,也就是该数据库中的所有表如果没有单独设置 TTL 选项,都将继承此选项值。
CREATE DATABASE test WITH (ttl='7d');
创建一个带有多个选项的数据库,包括仅追加模式和自定义内存表类型:
CREATE DATABASE test WITH (
ttl='30d',
'memtable.type'='partition_tree',
'append_mode'='true'
);
创建一个禁用预写日志并设置自定义合并模式的数据库:
CREATE DATABASE test WITH (
'skip_wal'='true',
'merge_mode'='last_non_null'
);
CREATE TABLE
Syntax
在 db 或当前数据库中创建新表:
CREATE TABLE [IF NOT EXISTS] [db.]table_name
(
column1 type1 [NULL | NOT NULL] [DEFAULT expr1] [TIME INDEX] [PRIMARY KEY] [indexes] [COMMENT comment1],
column2 type2 [NULL | NOT NULL] [DEFAULT expr2] [TIME INDEX] [PRIMARY KEY] [indexes] [COMMENT comment2],
...
[TIME INDEX (column)],
[PRIMARY KEY(column1, column2, ...)],
)
[
PARTITION ON COLUMNS(column1, column2, ...) (
<PARTITION EXPR>,
...
)
]
ENGINE = engine WITH([TTL | storage | ...] = expr, ...)
表 schema 由 ENGINE 之前的括号指定,表 schema 是列的定义和表的约束。
列定义包括列名称和数据类型,以及可选的 NULL、NOT NULL、DEFAULT 等。
关于 engine 选项和表引擎的选择,请阅读表引擎介绍。
表约束
表约束包括以下内容:
TIME INDEX指定时间索引列,每个表只能有一个时间索引列。它表示 GreptimeDB 的 数据模型 中的Timestamp类型。PRIMARY KEY指定表的主键列,它表示 GreptimeDB 的 数据模型 中的Tag类型。它不能包含时间索引列,但是它总是隐式地将时间索引列添加到键的末尾。- 其他列是 GreptimeDB 的 数据模型 中的
Field类型。
CREATE 语句中指定的 PRIMARY KEY 不是 传统关系数据库中的主键。
实际上,传统关系数据库中的 PRIMARY KEY 相当于 GreptimeDB 中的 PRIMARY KEY 和 TIME INDEX 的组合。
换句话说,PRIMARY KEY 和 TIME INDEX 一起构成了 GreptimeDB 中行的唯一标识符。
如果表已经存在且创建表时指定了 IF NOT EXISTS,CREATE 语句不会返回错误;否则返回错误。
索引
GreptimeDB 提供了丰富的索引实现来加速查询,请在索引章节查看更多信息。
表选项
用户可以使用 WITH 添 加表选项。有效的选项包括以下内容:
| 选项 | 描述 | 值 |
|---|---|---|
ttl | 表数据的存储时间 | 一个时间范围字符串,例如 '60m', '1h' 代表 1 小时, '14d' 代表 14 天等。支持的时间单位有:s / m / h / d |
storage | 自定义表的存储引擎,存储引擎提供商的名字 | 字符串,类似 S3、Gcs 等。必须在 [[storage.providers]] 列表里配置,参考 configuration。 |
compaction.type | Compaction 策略 | 字符串值。只支持 twcs。你可以阅读这篇文章来了解 twcs compaction 策略 |
compaction.twcs.trigger_file_num | 某个窗口内触发 compaction 的最小文件数量阈值 | 字符串值,如 '8'。只在 compaction.type 为 twcs 时可用 |
compaction.twcs.time_window | Compaction 时间窗口 | 字符串值,如 '1d' 表示 1 天。该表会根据时间戳将数据分区到不同的时间窗口中。只在 compaction.type 为 twcs 时可用 |
compaction.twcs.max_output_file_size | TWCS compaction 的最大输出文件大小 | 字符串值,如 '1GB'、'512MB'。设置 TWCS compaction 产生的文件的最大大小。只在 compaction.type 为 twcs 时可用 |
memtable.type | memtable 的类型 | 字符串值,支持 time_series,partition_tree |
append_mode | 该表是否时 append-only 的 | 字符串值。默认值为 'false',根据 'merge_mode' 按主键和时间戳删除重复行。设置为 'true' 可以开启 append 模式和创建 append-only 表,保留所有重复的行 |
merge_mode | 合并重复行的策略 | 字符串值。只有当 append_mode 为 'false' 时可用。默认值为 last_row,保留相同主键和时间戳的最后一行。设置为 last_non_null 则保留相同主键和时间戳的最后一个非空字段。 |
comment | 表级注释 | 字符串值。 |
index.type | Index 类型 | 仅用于 metric engine 字符串值,支持 none, skipping. |
skip_wal | 是否关闭表的预写日志 | 字符串类型。当设置为 'true' 时表的写入数据将不会持久化到预写日志,可以避免存储磨损同时提升写入吞吐。但是当进程重启时,尚未 flush 的数据会丢失。请仅在数据源本身可以确保可靠性的情况下使用此功能。 |
创建指定 TTL 的表
例如,创建一个存储数据 TTL(Time-To-Live) 为七天的表:
CREATE TABLE IF NOT EXISTS temperatures(
ts TIMESTAMP TIME INDEX,
temperature DOUBLE DEFAULT 10,
) with(ttl='7d');
ttl 值是一个字符串,支持以下类型的值:
- 时间范围字符串,如
1hour 12min 5s。 forever,NULL,0s(或任何长度为 0 的时间范围,如0d)或空字符串'',表示数据永远不会被删除。instant, 注意数据库的 TTL 不能设置为instant。instant表示数据在插入时立即删除,如果你想将输入发送到流任务而不保存它,可以使用instant,请参阅流管理文档了解更多细节。- 未设置,可以使用
ALTER TABLE <table-name> UNSET 'ttl'来取消表的ttl设置,这样表将继承数据库的ttl策略(如果有的话)。
如果一张表有自己的 TTL 策略,那么它将使用该 TTL 策略。否则,数据库的 TTL 策略将被应用到表上。
比如说,如果表的 TTL 设置为 forever