2013-06-27 18 views
20

Per Cassandra, do UPDATE s diventa implicito INSERT se la riga selezionata non esiste? Cioè, se dicoUn UPDATE diventa implicito INSERTO

UPDATE users SET name = "Raedwald" WHERE id = 545127 

e id è la PRIMARY KEY del tavolo users, e la tabella non ha alcuna riga con una chiave di 545127, sarà che essere equivalente a

INSERT INTO users (id, name) VALUES (545127, "Raedwald") 

So che è vero il contrario: un INSERT per un id già esistente diventa un UPDATE della riga con quello id. La documentazione più vecchia di Cassandra parlava degli inserti che in realtà erano "scottanti" per questo motivo.

Sono interessato al caso di CQL3, Cassandra versione 1.2+.

risposta

23

Sì, per Cassandra UPDATE è sinonimo di INSERT, come spiegato in the CQL documentation dove si dice quanto segue riguardo UPDATE:

Si noti che diversamente SQL, UPDATE non verifica l'esistenza prima della riga: il la riga viene creata se prima non esisteva nessuno e aggiornata in altro modo. Inoltre, non c'è modo di sapere quale di creazione o aggiornamento è successo. In effetti, la semantica di INSERT e UPDATE è identica.

Perché la semantica sia diversa, Cassandra dovrebbe fare una lettura per sapere se la riga esiste già. Cassandra è ottimizzato in scrittura, quindi puoi sempre presumere che non faccia una lettura prima di scrivere su qualsiasi operazione di scrittura. L'unica eccezione sono i contatori (a meno che non siano replicate_on_write = false), nel qual caso la replica su incremento implica una lettura.

+0

Ciao, ho una domanda, l'aggiornamento sulla chiave è lo stesso di insert, ma se voglio aggiornare i dati su un'altra colonna (come username o ...). è uguale a inserire? quale è la soluzione migliore per unire i dati di massa? –

11

Cosa si può fare è questo però:

UPDATE table_name SET field = false WHERE key = 55 IF EXISTS; 

Questo farà in modo che l'aggiornamento è un vero aggiornamento e non un upsert.