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'
错误原因
- Cassandra的INSERT语句语法要求,若直接传值必须用
VALUES关键字包裹参数;显式声明列名是更规范的写法,避免表结构变更后出错 - 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
相关产品推荐
相关产品推荐

