【问题标题】:Cassandra - Cannot re-add previously dropped counter columnCassandra - 无法重新添加以前删除的计数器列
【发布时间】:2019-05-12 05:12:23
【问题描述】:

我需要将我的 TABLE 更改计数器列更改为 int。

删除和添加前的表格:

CREATE TABLE <table_name> (
    id text PRIMARY KEY,
    questions_asked counter);

为了做到这一点,我首先尝试删除计数器列:

ALTER TABLE <table_name> DROP questions_asked;

比我尝试添加具有相同名称但这次为 int 的新列:

ALTER TABLE <table_name> ADD questions_asked int;

我收到以下错误:

InvalidRequest:来自服务器的错误:code=2200 [无效查询] message="无法重新添加以前删除的计数器列 questions_asked”

此外,如果我尝试为该列指定新名称,则会出现此错误:

ConfigurationException:无法添加非计数器列 (question_asked) 在计数器列族中

如果我将在具有不同类型的列上执行此序列 - 假设更改放置文本并添加 int 它将正常工作。

这种行为的解释是什么? 为什么计数器列下垂后似乎还在记忆中?

【问题讨论】:

标签: cassandra alter-table cqlsh


【解决方案1】:

问题是您正在尝试更改counter 列的类型,或者将具有非计数器类型的新列添加到具有计数器的表中。在 Cassandra 中,表可能只包含计数器类型,也可以包含其他类型,但不能将非计数器类型与计数器类型混合使用,除非非计数器类型的值仅在主键中。

您可以在documentation找到更多信息。

获取表结构后更新:

根据CASSANDRA-8099,您不能添加类型不兼容的列,并且counter 与任何内容都不兼容。关于以新名称添加 - 该表已标记为包含计数器,并且不能与非计数器类型一起使用。

为什么不简单地删除一个表并以正确的结构重新创建?

【讨论】:

  • 但是我放弃了!应该删了吧?我知道你写的问题,我不认为这是问题的答案。如果您仔细阅读,您会发现问题是为什么在删除计数器列之后,表格的行为仍然像我没有删除任何东西一样?
  • 因为您添加的是非计数器类型...请在删除列之前显示表结构
  • 我添加了表创建。如果删除确实会删除列,那么我的序列应该没有任何问题。您可以在一分钟内使用 cqlsh 重现它。奇怪的行为。
  • 现在我正在删除和创建,但我想了解这个问题。我熟悉我们不能添加不兼容的列的事实。我不明白为什么在我删除此列并且表中没有剩余计数器列之后,该表仍被标记为包含计数器(如您所写)?
  • 从我在源代码中看到的,删除列不会改变已经在表上设置的标志集,所以如果你用计数器创建表,它将得到相应的值在flags 字段中,然后它没有被清除...
猜你喜欢
  • 2017-03-29
  • 2012-09-28
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多