【问题标题】:Cassandra: Adding new column to the tableCassandra:向表中添加新列
【发布时间】:2016-07-07 14:14:22
【问题描述】:

您好,我刚刚在 my_table 表中添加了一个新列 Business_sys:

   ALTER TABLE my_table ALTER business_sys TYPE set<text>;

但我再次删除了这个列名,因为我想更改列的类型:

  ALTER TABLE my_table DROP business_sys;

当我尝试添加不同类型的相同列名时再次收到错误消息

"Cannnot add a collection with the name business_sys because the collection with the same name and different type has already been used in past"

我只是尝试执行这个命令来添加一个不同类型的新列-

  ALTER TABLE my_table ADD business_sys list<text>;

我做错了什么?我对卡桑德拉很陌生。有什么建议吗?

【问题讨论】:

    标签: cassandra cassandra-2.0 datastax-java-driver


    【解决方案1】:

    您遇到了CASSANDRA-6276。问题是当您在 Cassandra 中删除一列时,该列中的数据并没有消失,而且 Cassandra 可能会尝试使用其新的比较器类型读取该数据。

    来自链接的 JIRA 票证:

    很遗憾,我们不允许从比较器中删除组件,包括从 ColumnToCollectionType 中删除单个集合列。 如果我们确实允许这样做,并且有该类型的预先存在的数据,C* 根本不知道如何比较这些......

    ...即使我们这样做了,并允许 [users] 创建具有相同名称的不同集合,我们也会遇到不同的问题:新集合的比较器将用于比较可能不兼容的类型。

    JIRA 建议这在 Cassandra 3.x 中可能不是问题,但我刚刚在 3.0.3 中尝试过,但失败并出现同样的错误。

    我做错了什么?我对卡桑德拉很陌生。有什么建议吗?

    不幸的是,解决这个问题的唯一方法是为您的新列表使用不同的名称。

    【讨论】:

    • 它在您删除列时起作用,重新创建一个非集合列,例如具有相同名称的int,然后再次删除该列。之后,您可以添加具有不同集合类型的相同名称列,并且 cassandra 允许该操作。肮脏的解决方法!
    • @ken 非常感谢您的评论。这确实有效并解决了我的问题。
    • 我刚刚在 Cassandra 3 和 4 (Beta) 中尝试了 @Masum 的建议,不幸的是这种方法不起作用。根据 Datastax 工程师的说法,这也是不可能的:community.datastax.com/questions/8018/…
    【解决方案2】:

    编辑:我已经在 Cassandra 中进行了尝试,结果丢失数据不一致。最好的方法是按照CASSANDRA-6276 中的建议更改列名。并始终遵循文档指南:)

    -警告- 根据来自CASSANDRA-6276this comment,运行以下解决方法是不安全的。

    详细说明 @masum 的评论 - 可以通过首先使用非集合类型(例如 int)重新创建列来解决限制。之后,您可以使用新的集合类型删除并重新创建。

    从您的示例中,假设我们有一个 business_sys 集:

    ALTER TABLE my_table ADD business_sys set<text>;
    ALTER TABLE my_table DROP business_sys;
    

    现在将列重新添加为 int 并再次删除:

    ALTER TABLE my_table ADD business_sys int;
    ALTER TABLE my_table DROP business_sys;
    

    最后,您可以重新创建具有相同名称但不同集合类型的列:

    ALTER TABLE my_table ADD business_sys list<text>;
    

    【讨论】:

    • 您永远不应该添加与被删除的名称相同但类型不同的列...
    猜你喜欢
    • 2019-09-03
    • 2016-10-09
    • 1970-01-01
    • 2015-09-08
    • 2015-09-06
    • 2020-04-06
    • 2016-05-21
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多