您好我刚刚将一个新列Business_sys添加到我的表my_table:
ALTER TABLE my_table ALTER business_sys TYPE set<text>;
但是我再次删除了这个列名,因为我想改变列的类型:
ALTER TABLE my_table DROP business_sys;
当我尝试使用不同类型添加相同的colmn名称时收到错误消息
"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>;
我做错了什么?我对卡桑德拉很新。有什么建议吗?
答案 0 :(得分:4)
您正在遇到CASSANDRA-6276。问题是当您在Cassandra中删除一列时,该列中的数据不会消失,而Cassandra可能会尝试使用其新的比较器类型读取该数据。
来自链接的JIRA票证:
不幸的是,我们不允许从比较器中删除组件,包括从ColumnToCollectionType中删除单个集合列。 如果我们允许这样做,并且预先存在该类型的数据,那么C *根本不知道如何比较这些......
...即使我们这样做了,并允许[用户]创建一个具有相同名称的不同集合,我们也遇到了另一个问题:新集合的比较器将用于潜在比较不兼容的类型。
JIRA认为这可能不是Cassandra 3.x中的一个问题,但我只是在3.0.3中尝试过它并且失败并出现同样的错误。
我做错了什么?我对卡桑德拉很新。有什么建议吗?
不幸的是,解决这个问题的唯一方法是为新列表使用不同的名称。
答案 1 :(得分:0)
编辑:我已经在Cassandra中进行了尝试,结果丢失了不一致的数据。最好的处理方法是按照CASSANDRA-6276中的建议更改列名。并始终遵循文档指南:)
-警告- 根据{{3}}中的this 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>;