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- memtable 类型(bulk、time_series)append_mode- 数据库中的表是否为仅追加模式(true/false)merge_mode- 合并重复行的策略(last_row、last_non_null)skip_wal- 是否为数据库中的表禁用预写日志('true'/'false')sst_format- 数据库中表的 SST(Sorted String Table)文件格式(flat、primary_key)compaction.*- 压缩相关设置(如compaction.type、compaction.twcs.time_window)
阅读更多关于表选项的信息。
数据库选项的行为有所不同:
-
TTL 和 Compaction 选项(
ttl、compaction.*):这些选项具有持续影响。没有指定这些值的表会持续继承数据库级别的值。更改数据库 TTL 或 compaction 选项会立即影响所有没有明确自行设置这些选项的表。 -
其他选项(
memtable.type、append_mode、merge_mode、skip_wal、sst_format):这些选项充当模板变量,仅在创建新表时应用。更改这些数据库级别的选项不会影响已存在的表——它们仅作为新创建表的默认值。
在创建表时,如果未提供相应的表选项,将使用在数据库级别配置的选项或者默认值。
示例
创建名为 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'='bulk',
'append_mode'='true'
);
创建一个禁用预写日志并设置自定义合并模式的数据库:
CREATE DATABASE test WITH (
'skip_wal'='true',
'merge_mode'='last_non_null'
);
创建一个指定 SST 文件格式的数据库:
CREATE DATABASE test WITH ('sst_format'='flat');
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类型。
PRIMARY KEY 列和 TIME INDEX 共同组成用于排序与合并数据行的存储键。与关系数据库的主键不同,该存储键不强制唯一性。merge_mode和 append_mode决定 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 类型 | 字符串值:bulk 或 time_series。未设置时,Mito 根据 SST format 选择实现;默认的 flat format 使用 bulk。设置 bulk 会强制使用 sst_format=flat;使用 flat SST 时,即使设置了 time_series,Mito 也会选择 bulk 实现。旧值 partition_tree 仅为兼容保留,并映射到 bulk 和 flat 路径。 |
append_mode | 该表是否时 append-only 的 | 字符串值。默认值为 'false',根据 'merge_mode' 按主键和时间戳删除重复行。设置为 'true' 可以开启 append 模式和创建 append-only 表,保留所有重复的行 |
merge_mode | 合并重复行的策略 | 字符串值。只有当 append_mode 为 'false' 时可用。默认值为 last_row,保留相同主键和时间戳的最后一行。设置为 last_non_null 则保留相同主键和时间戳的最后一个非空字段。 |
sst_format | SST 文件的格式 | 字符串值,支持 primary_key,flat。默认为 flat。flat 格式建议用于具有高基数主键的表。 |
comment | 表级注释 | 字符串值。 |
index.type | Index 类型 | 仅用于 metric engine 字符串值,支持 none, skipping. |
skip_wal | 是否关闭表的预写日志 | 字符串类型。当设置为 'true' 时表的写入数据将不会持久化到预写日志,可以避免存储磨损同时提升写入吞吐。但是当进程重启时,尚未 flush 的数据会丢失。请仅在数据源本身可以确保可靠性的情况下使用此功能。 |