You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CQL INSERT语句报SyntaxException,如何正确插入并生成唯一timeuuid?

Cassandra插入语句错误修正及TimeUUID使用方案

问题场景

表结构定义:

CREATE TABLE test.messages_by_channel (
    channel_id int,
    message_id timeuuid,
    message text,
    user_id int,
    PRIMARY KEY (channel_id, message_id)
) WITH CLUSTERING ORDER BY (message_id DESC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
    AND comment = ''
    AND compaction = {'class': 'SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

执行插入语句时触发语法错误:

insert into messages_by_channel(1, now(), "test", 2);

错误提示:

SyntaxException: line 1:32 no viable alternative at input '1'

错误原因

  1. Cassandra的INSERT语句语法要求,若直接传值必须用VALUES关键字包裹参数;显式声明列名是更规范的写法,避免表结构变更后出错
  2. Cassandra中字符串字面量需用单引号包裹,双引号仅用于引用标识符(如列名、表名)

正确插入语句

推荐写法(显式指定列名,可读性强、适配表结构变更)

INSERT INTO test.messages_by_channel (channel_id, message_id, message, user_id)
VALUES (1, now(), 'test', 2);

简写写法(按表定义列顺序插入所有字段,不推荐)

INSERT INTO test.messages_by_channel VALUES (1, now(), 'test', 2);

TimeUUID生成说明

  • 语句中使用的now()是Cassandra内置函数,会生成带时间戳属性的唯一TimeUUID,完全适配表中message_id字段的类型要求,同时能满足聚类键按时间倒序排序的需求
  • 若需生成普通UUID而非TimeUUID,可替换为uuid()函数,但TimeUUID自带时间属性,更适合消息这类需按时间排序的场景

内容的提问来源于stack exchange,提问作者Venelin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:34:52