Clickhouse 创建表查询抛出语法错误

Posted

技术标签:

【中文标题】Clickhouse 创建表查询抛出语法错误【英文标题】:Clickhouse create table query throwing syntax error 【发布时间】:2021-10-14 15:29:46 【问题描述】:

我正在执行下面给出的查询,但它抛出了一个错误。我是 Clickhouse 的新手,您能帮我解决一下吗?

CREATE TABLE rapidTax.mutualFund (
    `id` varchar(255),
    `mutualFundId` varchar(255) DEFAULT NULL,
    `date` date DEFAULT NULL,
    `nav` float DEFAULT NULL,

    INDEX mutualFundIdIndex mutualFundId,
    INDEX dateIndex date
) ENGINE = MergeTree(),
PRIMARY KEY id

抛出错误:

代码:62。DB::Exception:语法错误:在位置 247 ('dateIndex') 失败(第 8 行,第 11 列):dateIndex 日期 ) 引擎 = MergeTree(), 主键 ID。预期之一:逗号、箭头、标记。 (SYNTAX_ERROR) (版本 21.9.4.35 (正式版))

【问题讨论】:

【参考方案1】:

阅读文档。应该是

CREATE TABLE mutualFund (
    `id` String,
    `mutualFundId` Nullable(String) DEFAULT NULL,
    `date` Nullable(Date) DEFAULT NULL,
    `nav` Nullable(Float64) DEFAULT NULL,
    INDEX mutualFundIdIndex(mutualFundId) TYPE bloom_filter GRANULARITY 3,
    INDEX dateIndex date TYPE minmax GRANULARITY 1
) 
ENGINE = MergeTree()
Partition by toYYYYMM(ifNull(date,toDate(0)))
ORDER BY id
PRIMARY KEY id

实际上它将无法使用。

使用这个

CREATE TABLE mutualFund (
    `id` String,
    `mutualFundId` LowCardinality(String),
    `date` Date,
    `nav` Nullable(Float64) DEFAULT NULL
) 
ENGINE = MergeTree()
Partition by toYYYYMM(date)
ORDER BY (mutualFundId,date)
PRIMARY KEY (mutualFundId,date)

为字符串列存储空字符串而不是 Null。 为日期列存储 0(1970-01-01) 而不是 Null。

Clickhouse 中没有逆索引,但是有跳过索引和 orderby 投影。

PRIMARY KEY === 主索引(不是 KEY)。 CH 中没有唯一约束。

【讨论】:

以上是关于Clickhouse 创建表查询抛出语法错误的主要内容,如果未能解决你的问题,请参考以下文章

大数据(5p)ClickHouse异于平常SQL的语法

大数据ClickHouse(十五):ClickHouse SQL语法之DDL 操作讲解

Mysql中表名如果是3e开头,查询时报语法错,原因未知

Mysql中表名如果是3e开头,查询时报语法错,原因未知

客快物流大数据项目(九十七):ClickHouse的SQL语法

ClickHouse-尚硅谷(10. 高级-语法优化规则)学习笔记