Question Un UPDATE devient-il un INSERT implicite?


Pour Cassandra, fais UPDATEs devenir implicite INSERT si la ligne sélectionnée n'existe pas? C'est, si je dis

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

et id est le PRIMARY KEY du users table, et la table n'a pas de ligne avec une clé de 545127, cela sera-t-il équivalent à

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

Je sais que le contraire est vrai: un INSERT pour un id qui existe déjà devient un UPDATE de la rangée avec ça id. Les documents plus anciens de Cassandra mentionnaient que les insertions étaient en réalité des "produits en hausse" pour cette raison.

Je suis intéressé par le cas pour CQL3, Cassandra version 1.2+.


22
2018-06-27 16:33


origine


Réponses:


Oui, pour Cassandra UPDATE est synonyme de INSERT, comme expliqué dans la documentation CQL où il est dit à propos de UPDATE:

Notez que contrairement à SQL, UPDATE ne vérifie pas l'existence préalable de la ligne: la ligne est créée si aucune n'existe auparavant et mise à jour autrement. De plus, il n'y a aucun moyen de savoir quelle création ou mise à jour s'est produite. En fait, la sémantique de INSERT et UPDATE sont identiques.

Pour que la sémantique soit différente, Cassandra devrait faire une lecture pour savoir si la ligne existe déjà. Cassandra est optimisé en écriture, vous pouvez donc toujours supposer qu'il ne lit pas avant d'écrire sur une opération d'écriture. La seule exception concerne les compteurs (sauf sireplicate_on_write = false), auquel cas la réplication par incrément implique une lecture.


30
2018-06-27 16:41



Ce que l'on peut faire, c'est ceci:

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

Cela garantira que votre mise à jour est une vraie mise à jour et non une mise à jour.


12
2018-06-28 15:29