2013-05-13 11 views
36

Qual è la differenza tra UPDATE e INSERT quando si esegue CQL contro Cassandra?Differenza tra UPDATE e INSERT in Cassandra?

Sembra che non ci fosse differenza, ma ora lo documentation dice che INSERT non supporta i contatori mentre lo fa UPDATE.

Esiste un metodo "preferito" da utilizzare? O ci sono casi in cui uno dovrebbe essere usato rispetto all'altro?

Grazie mille!

+0

Esiste una differenza di prestazioni tra 'INSERT' vs' UPDATE'? – Pankaj

+0

@Pankaj Voglio anche sapere questo. Conosci qualche conoscenza al riguardo? – niaomingjian

+0

Mi dispiace @niaomingjian Non ho trovato ulteriori informazioni su questo. – Pankaj

risposta

17

Le colonne contatore in Cassandra non possono essere impostate su un valore arbitrario: possono essere incrementate o decrementate solo da qualsiasi valore arbitrario.

Per questo motivo, INSERT non supporta Counter Column perché non è possibile "inserire" un valore in una colonna contatore. Puoi solo aggiungere UPDATE (incremento o decremento) di qualche valore. Ecco come aggiornare una colonna Contatore.

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

ti ha chiesto:

Esiste un metodo "preferito" da usare? O ci sono casi in cui uno dovrebbe essere usato rispetto all'altro?

Sì. Se si inseriscono valori nel database, è possibile utilizzare INSERT. Se la colonna non esiste, verrà creata per te. In caso contrario, l'effetto di INSERT è simile a UPDATE. INSERT è utile quando non si dispone di uno schema preconfigurato (Famiglia di colonne dinamiche, vale a dire inserire qualsiasi cosa, in qualsiasi momento). Se si sta progettando lo schema in anticipo (famiglia di colonne statiche, simile a RDMS) e si conosce ciascuna colonna, è possibile utilizzare UPDATE.

+0

Grazie mille, questo chiarisce davvero le cose! –

+1

non dice che sono uguali? Ad esempio "A differenza di SQL, la semantica di INSERT e UPDATE è identica." http://www.datastax.com/docs/1.1/references/cql/INSERT – Pinocchio

42

C'è una sottile differenza. I record inseriti tramite INSERT rimangono se si impostano tutti i campi non chiave su null. I record inseriti tramite UPDATE vanno via se si impostano tutti i campi non chiave su null.

Prova questa:

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; 

Returns:

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

Ora, aggiornare ogni impostazione f1 a null fila.

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

Si noti che rimane la riga 1, mentre viene rimossa la riga 2.

Se si guardano questi utilizzando Cassandra-cli, si vedrà un diverso nel modo in cui vengono aggiunte le righe.

mi piacerebbe certo sapere se questo è di progettazione o di un bug e vedere questo comportamento documentato.

+4

Buona cattura! Hai acquisito più informazioni su di esso? –

+0

Ecco la spiegazione: https://issues.apache.org/jira/browse/CASSANDRA-11805 – Milan

0

Per quanto riguarda la sottile differenza evidenziata da billbaird (io sono in grado di commentare quel post direttamente), dove una fila creato da un'operazione di aggiornamento sarà eliminato se tutti i campi non chiave sono nulli:

che ci si aspetta comportamento e non un bug basato sul bug report al https://issues.apache.org/jira/browse/CASSANDRA-11805 (che era chiuso come "Not A Problem")

Mi sono imbattuto in questo me stesso quando si utilizza Spring Data per la prima volta. Stavo usando il metodo save(T entity) di un repository, ma non è stata creata alcuna riga. Spring Data utilizzava un UPDATE perché determinava che l'oggetto non era "nuovo" (non è sicuro che il test per "isNew" abbia senso qui), e mi è capitato di testare con entità che avevano solo i campi chiave impostati .

Per questo caso primavera dati, le interfacce repository Cassandra-specifiche forniscono un metodo insert che appaiono utilizzare in modo coerente un INSERT se tale comportamento è voluta invece (anche se la documentazione di primavera non documenta questi dettagli a sufficienza o).

0

Un'altra sottile differenza (sto iniziando a credere che cql sia una terribile interfaccia per cassandra, piena di sottigliezze e caveat dovute all'uso di sintassi SQL simile ma semantica leggermente diversa) è l'impostazione TTL sui dati esistenti. Con UPDATE non è possibile aggiornare il TTL delle chiavi, anche se i nuovi valori attuali sono uguali ai vecchi valori. La soluzione è INSERIRE la nuova riga invece, con il nuovo TTL già impostato