我正在设置一个Cassandra数据库,并尝试使用MD5哈希代码作为表名创建表。 当我这样做时,我得到了一个com.datastax.oss.driver.api.core.servererrors.SyntaxError: line 1:35 mismatched character '2' expecting '-'
异常。
我的查询:
CREATE TABLE IF NOT EXISTS 77f2d6b127b7d4a89a940d0829ff1e672afb4362_status (
jsonSchema TEXT,
onlineStatus INT,
key text,
timestamp timeuuid,
primary key(key, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC)
AND compaction = {'class': 'TimeWindowCompactionStrategy',
'compaction_window_size': 1,
'compaction_window_unit': 'DAYS'};
例外情况:
Caused by: com.datastax.oss.driver.api.core.servererrors.SyntaxError: line 1:35 mismatched character '2' expecting '-'
at com.datastax.oss.driver.api.core.servererrors.SyntaxError.copy(SyntaxError.java:48)
at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:113)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:53)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:30)
at com.datastax.oss.driver.internal.core.session.DefaultSession.execute(DefaultSession.java:207)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:47)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:56)
我想知道为什么会这样。根据 https://docs.datastax.com/en/archived/cql/3.3/cql/cql_reference/ref-lexical-valid-chars.html 查询应具有正确的语法。
我试过什么
双引号
当我将表名放在双引号(CREATE TABLE IF NOT EXISTS "77f2d6b127b7d4a89a940d0829ff1e672afb4362_status" (...
)中时,它可以工作,但随后我的 IntelliJ 数据库 IDE 出现问题,因为它不使用双引号查询数据库作为表名。
以字母 ([a-z]) 开头的表名
当我手动在表名前面添加一个字母(不是数字;例如a77f2d6b127b7d4a89a940d0829ff1e672afb4362_status
),表已创建,但我收到另一个超时异常:
com.datastax.oss.driver.api.core.DriverTimeoutException: Query timed out after PT2S
at com.datastax.oss.driver.api.core.DriverTimeoutException.copy(DriverTimeoutException.java:34)
at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:113)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:53)
at com.datastax.oss.driver.internal.core.cql.CqlRequestSyncProcessor.process(CqlRequestSyncProcessor.java:30)
at com.datastax.oss.driver.internal.core.session.DefaultSession.execute(DefaultSession.java:207)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:47)
at com.datastax.oss.driver.api.core.CqlSession.execute(CqlSession.java:56)
超时异常后,我可以再次执行相同的查询。这次没有错误 ->表已成功创建。
我使用以下Java驱动程序:[Maven: com.datastax.oss:java-driver-core:4.0.1]
任何帮助都非常受欢迎。
我认为文档不正确 - 它应该说:
以字母字符开头,包含字母数字,...
我还没有在 CQL 的语法中找到表/键空间名称的这个定义(仅适用于列名),但它在 cqlsh 代码中可见。
- 在 CQL 语法中,表名的规则称为
cfName
。如您所见,表名可以是非引号标识符(IDENT
),带引号的名称(QUOTED_NAME
)或非保留关键字。此处定义了IDENT
规则。如您所见,它需要以字母开头。要创建一个像你这样命名的表,你需要用它加双引号(我尝试过使用 CQLSH,它有效 - 抱歉,如果 IntelliJ 无法理解这一点)。 - 默认情况下,CQL 查询的驱动程序超时为 2 秒。对于 DDL 查询,这通常是不够的。您可以提高单个查询的超时,如下所示:
session.execute( SimpleStatement.newInstance( "如果不存在,则创建表...") .setTimeout(Duration.ofSeconds(30)));