[英]Cassandra: Adding new column to the table
您好,我剛剛在我的表 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-6276 。 問題是當您在 Cassandra 中刪除一列時,該列中的數據不會消失,並且 Cassandra 可能會嘗試使用其新的比較器類型讀取該數據。
從鏈接的 JIRA 票證:
不幸的是,我們不能允許從比較器中刪除組件,包括從 ColumnToCollectionType 中刪除單個集合列。 如果我們確實允許這樣做,並且有這種類型的預先存在的數據,C* 根本不知道如何比較這些......
...即使我們這樣做了,並允許 [users] 使用相同的名稱創建不同的集合,我們也會遇到一個不同的問題:新集合的比較器將用於比較可能不兼容的類型。
JIRA 建議這在 Cassandra 3.x 中可能不是問題,但我只是在 3.0.3 中嘗試過它並且失敗並出現相同的錯誤。
我做錯了什么? 我對 Cassandra 很陌生。 有什么建議嗎?
不幸的是,解決這個問題的唯一方法是為您的新列表使用不同的名稱。
編輯:我已經在 Cassandra 中嘗試過這個,結果丟失的數據不一致。 最好的方法是按照CASSANDRA-6276 中的建議更改列名。 並始終遵循文檔指南:)
-警告-根據CASSANDRA-6276 的評論,運行以下解決方法是不安全的。
詳細說明@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>;
Cassandra 不允許您重新創建具有相同名稱和相同數據類型的列,但有一種解決方法可以修復它。
一旦刪除了 SET 類型的列,就可以僅使用另一種“默認”類型(例如 varchar 或 interger)重新創建它。 使用其中一種類型重新創建后,您可以再次刪除該列,最后使用正確的類型重新創建。
我在下面說明了它
ALTER TABLE my_table DROP business_sys; # the drop you've done
ALTER TABLE my_table ADD business_sys varchar; # recreating with another type
ALTER TABLE my_table DROP business_sys; # dropping again
ALTER TABLE my_table ADD business_sys list<text>; # recreating with proper type
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.