简体中文
Appearance
简体中文
Appearance
CREATE 语句是 SQL 中用于创建数据库对象(如数据库、表、索引等)的核心语句。通过 CREATE 语句,用户可以定义对象的结构、约束以及属性,是数据库设计和初始化的基础。
TIP
Datalayers 中数据库名、表名、字段名 大小写敏感
CREATE DATABASE [IF NOT EXISTS] database_name示例
CREATE DATABASE hello_datalayers表示创建一个名为 hello_datalayers 的数据库。
CREATE TABLE [IF NOT EXISTS] [database.]table_name
(
column_name data_type [column_constraint] [ DEFAULT default_expr ],
...
...
timestamp key (ts_column_name)
)
PARTITION BY HASH(expr) PARTITIONS PARTITOIN_NUM
ENGINE=TimeSeries
with(k=v,k1=v1)对于时序(TimeSeries)引擎,至少有一个列需要为 TIMESTAMP 类型,且必须使用 timestamp key 语句来指定唯一的 timestamp key 列,这个列的类型必须为 TIMESTAMP。
TIP
TIMESTAMP 类型字段,默认值支持数值常量、RFC3339 / ISO8601 格式时间字符串以及时间戳函数CURRENT_TIMESTAMP,在写入数据时对于缺失的 TIMESTAMP 类型字段会自动设置为当前时间。 其他类型字段的默认值仅支持常量。
示例
CREATE TABLE sx1(
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
sid INT32,
value REAL,
flag INT8,
timestamp key (ts),
)
PARTITION BY HASH(sid) PARTITIONS 1
ENGINE=TimeSeries
with (ttl='10d')CREATE SOURCE 用于定义一个流式输入对象。它描述外部数据源的字段、connector 和 format,但它本身不是一个表,无法接查询和写入。
语法
CREATE SOURCE source_name (
column_name data_type [NOT NULL],
...
) WITH (
connector='kafka|mqtt|http',
format='json|csv',
key='value',
...
)示例
CREATE SOURCE src_kafka (
ts TIMESTAMP(9) NOT NULL,
sid STRING NOT NULL,
value FLOAT64
) WITH (
connector='kafka',
brokers='127.0.0.1:9092',
topic='topic_stream_demo',
offset='earliest',
format='json'
);说明
WITH (...) 为必填,且不能为空。CREATE SOURCE 暂不支持 IF NOT EXISTS。CREATE PIPELINE 用于创建持续运行的流任务。pipeline 从一个 source 读取数据,执行实时计算,然后把结果写入一个已有的 sink table。
语法
CREATE PIPELINE pipeline_name
SINK TO [database.]sink_table_name
AS
SELECT ...示例
CREATE PIPELINE p_kafka
SINK TO sink_t
AS
SELECT ts, sid, value
FROM src_kafka
WHERE value >= 2.0;说明
CREATE PIPELINE 暂不支持 IF NOT EXISTS。AS 后必须是 SELECT 查询。CREATE PIPELINE 时,当前用户需要对 source 具备 SELECT 权限,并对 sink table 具备 INSERT 权限。除了使用 CREATE INDEX 在建表后创建索引,Datalayers 也支持在 CREATE TABLE 的表约束中直接声明索引。
语法(片段)
CREATE TABLE [IF NOT EXISTS] [database.]table_name (
...,
timestamp key(ts_column),
inverted index [index_name] (string_column) [with (key=value, ...)],
vector index [index_name] (vector_column) [with (key=value, ...)]
)
PARTITION BY HASH(expr) PARTITIONS n示例
CREATE TABLE sx1(
ts TIMESTAMP,
sid INT32,
message STRING,
timestamp key(ts),
inverted index idx_message (message) with (tokenizer=standard)
)
PARTITION BY HASH(sid) PARTITIONS 1;
CREATE TABLE sx2(
ts TIMESTAMP,
sid INT32,
vec VECTOR(3),
timestamp key(ts),
vector index (vec)
)
PARTITION BY HASH(sid) PARTITIONS 1;TIP
索引创建语法见本文下方章节;索引刷新与删除请参考 REFRESH 语句详解 与 DROP 语句详解。
作用
在字符串列上创建倒排索引,用于日志与文本场景的全文检索加速。
语法
CREATE INVERTED INDEX [CONCURRENTLY] [IF NOT EXISTS] [index_name]
ON [database.]table_name (column_name)
[WITH (key=value, ...)]选项
tokenizer:分词器,standard | chinese,默认 standardwith_position:是否保存词位置信息,true | false,默认 falsefilters:过滤器列表,使用 , 分隔,默认 lowercase,english_stopfilters 可选项说明:
| 过滤器 | 作用 | 适用场景 |
|---|---|---|
lowercase | 将英文 token 统一转为小写,减少大小写差异影响 | 英文日志或中英混合文本检索 |
english_stop | 过滤英文停用词(如 the、is) | 需要降低英文高频虚词噪音 |
english_stemmer | 对英文词做词干提取(如 running -> run) | 需要提升英文词形变化召回 |
standard 说明:standard 分词器基于空格和标点符号进行分词,适合英文文本。
示例
CREATE INVERTED INDEX idx_message ON logs (message);
CREATE INVERTED INDEX IF NOT EXISTS idx_message ON logs (message);
CREATE INVERTED INDEX idx_message_cn ON logs (message)
WITH (tokenizer='chinese', filters='lowercase,english_stop', with_position='true');
CREATE INVERTED INDEX idx_message_std ON logs (message)
WITH (tokenizer='standard', filters='lowercase,english_stop,english_stemmer');作用
在向量列上创建向量索引,用于加速近似最近邻检索。
语法
CREATE VECTOR INDEX [CONCURRENTLY] [IF NOT EXISTS] [index_name]
ON [database.]table_name (vector_column)
[WITH (key=value, ...)]选项
type:向量索引类型,如 IVF_PQ、IVF_RQ、HNSW、HNSW_PQ 等distance:距离函数,l2 | cosine | dotnum_cells:IVF 类索引簇数量,默认 32num_sub_vectors:PQ 子向量个数,默认 32num_bits:PQ 编码位数,目前支持 8max_level:HNSW 最大层数,默认 7m:HNSW 每个节点最大邻居数,默认 10ef_construction:HNSW 构建候选邻居数,默认 50示例
CREATE VECTOR INDEX idx_embed ON logs (embed)
WITH (type=IVF_PQ, distance=L2);
CREATE VECTOR INDEX idx_embed_hnsw ON logs (embed)
WITH (type=HNSW, distance=cosine, max_level=7, m=10, ef_construction=50);