2013-05-13 76 views
36

對Cassandra執行CQL時,UPDATEINSERT之間有什麼區別?Cassandra中UPDATE和INSERT的區別?

它看起來像曾經沒有區別,但現在documentationINSERT不支持計數器,而UPDATE不支持計數器。

是否有「首選」方法使用?還是有一種情況下應該使用另一種?

非常感謝!

+0

INSERT'和'UPDATE'之間是否存在任何性能差異? – Pankaj 2017-01-18 17:08:20

+0

@Pankaj我也想知道這一點。你知道這方面的知識嗎? – niaomingjian 2017-02-24 06:00:53

+0

對不起@niaomingjian我沒有找到關於此的更多信息。 – Pankaj 2017-03-11 18:56:41

回答

17

Cassandra中的計數器列不能設置爲任意值:它們只能以任意值遞增或遞減。

因此,INSERT不支持Counter Column,因爲您無法將值插入到Counter列中。你只能用UPDATE(增加或減少)某個值。您將如何更新Counter列。

UPDATE ... SET name1 = name1 + <value> 

你問:

是否有一個 「首選」 的方法來使用?還是有一種情況下應該使用另一種?

是的。如果要將值插入數據庫,則可以使用INSERT。如果該列不存在,它將爲您創建。否則,INSERT的效果與UPDATE類似。 INSERT在您沒有預先設計的模式(動態列族,即隨時插入任何東西)時非常有用。如果您事先設計架構(靜態列族,類似於RDMS)並知道每一列,那麼您可以使用UPDATE

+0

非常感謝,這真的澄清了事情! – 2013-05-14 18:40:48

+1

不是說它們是一樣的嗎?即「與SQL不同,INSERT和UPDATE的語義是相同的。」 http://www.datastax.com/docs/1.1/references/cql/INSERT – Pinocchio 2014-04-05 23:53:41

42

有一個微妙的區別。如果您將所有非關鍵字字段設置爲空,則通過INSERT插入記錄將保留。如果您將所有非關鍵字字段設置爲空,則通過UPDATE插入的記錄將消失。

試試這個:

CREATE TABLE T (
    pk int, 
    f1 int, 
    PRIMARY KEY (pk) 
); 

INSERT INTO T (pk, f1) VALUES (1, 1); 
UPDATE T SET f1=2 where pk=2; 
SELECT * FROM T; 

返回:

pk | f1 
----+---- 
    1 | 1 
    2 | 2 

現在,更新的每一行設置F1爲null。

UPDATE T SET f1 = null WHERE pk = 1; 
UPDATE T SET f1 = null WHERE pk = 2; 
SELECT * FROM T; 

注意,行1所保持,而行2被去除。

pk | f1 
----+------ 
    1 | null 

如果你看看這些使用卡桑德拉-CLI,你會看到在行如何添加不同的。

我確定想知道這是設計還是錯誤,並查看記錄的行爲。

+4

好的!你有沒有獲得更多的見解呢? – 2014-07-07 12:59:37

+0

以下是解釋:https://issues.apache.org/jira/browse/CASSANDRA-11805 – Milan 2017-07-17 07:11:14

0

關於通過billbaird突出的細微差別(我無法在該職位直接評論),其中如果所有非鍵字段都爲空的更新操作創建的行會被刪除:

,預計行爲,而不是基於在https://issues.apache.org/jira/browse/CASSANDRA-11805(它被關閉爲「不是問題」)的bug報告的錯誤

我第一次使用Spring Data時遇到了這個問題。我正在使用存儲庫的save(T entity)方法,但沒有創建行。事實證明,Spring Data使用的是UPDATE,因爲它確定該對象不是'新的'(不確定'isNew'的測試是否有意義),而我碰巧正在測試僅設置了關鍵字段的實體。

今年春季數據的情況下,卡珊德拉專用庫接口都提供insert方法出現,如果這種行爲需要,而不是一直使用的INSERT(雖然Spring的文檔不充分或者記錄這些細節)。

0

另一個細微的差異(我開始相信cql是cassandra的一個糟糕的接口,由於使用了類似的SQL語法,但語義略有不同,所以充滿了細節和警告)是在現有數據上設置TTL。使用UPDATE即使新的實際值等於舊值,也無法更新密鑰的TTL。解決方案是插入新行,而新的TTL已設置