update into cassandra cql cql3

into - ¿Diferencia entre UPDATE e INSERT en Cassandra?



insert set cassandra (4)

En cuanto a la diferencia sutil resaltada por billbaird (no puedo comentar esa publicación directamente) donde una fila creada por una operación de actualización se eliminará si todos los campos que no son clave son nulos:

Ese es el comportamiento esperado y no un error basado en el informe de errores en issues.apache.org/jira/browse/CASSANDRA-11805 (que se cerró como "No es un problema")

Me encontré con esto cuando uso Spring Data por primera vez. Estaba usando el método save(T entity) de un repositorio, pero no se estaba creando ninguna fila. Resultó que Spring Data estaba usando UPDATE porque determinaba que el objeto no era "nuevo" (no estoy seguro de que la prueba para "isNew" tenga sentido aquí), y por casualidad estaba probando con entidades que solo tenían los campos clave establecidos .

Para este caso de Spring Data, las interfaces de repositorio específicas de Cassandra sí proporcionan un método de insert que parece usar sistemáticamente un INSERT si se desea ese comportamiento (aunque la documentación de Spring tampoco documenta estos detalles suficientemente).

¿Cuál es la diferencia entre UPDATE e INSERT al ejecutar CQL contra Cassandra?

Parece que no solía haber diferencia, pero ahora la documentation dice que INSERT no admite contadores mientras que UPDATE sí.

¿Hay un método "preferido" para usar? ¿O hay casos en que uno debe usarse sobre el otro?

¡Muchas gracias!


Hay una sutil diferencia. Los registros insertados a través de INSERT permanecen si configura todos los campos que no son clave para nulos. Los registros insertados a través de ACTUALIZAR desaparecen si establece nulos todos los campos que no son clave.

Prueba esto:

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;

Devoluciones:

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

Ahora, actualice cada ajuste de fila f1 a nulo.

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

Tenga en cuenta que la fila 1 permanece, mientras que la fila 2 se elimina.

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

Si miras esto usando Cassandra-cli, verás una forma diferente de cómo se agregan las filas.

Me gustaría saber si esto es por diseño o un error y ver documentado este comportamiento.


Las columnas de contador en Cassandra no se pudieron establecer en un valor arbitrario: solo se pueden incrementar o disminuir mediante cualquier valor arbitrario.

Por este motivo, INSERT no admite Contador de columna porque no puede "insertar" un valor en una Columna de contador. Solo puede UPDATE (aumentar o disminuir) en algún valor. Así es como actualizaría una columna de Contador.

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

Tu preguntaste:

¿Hay un método "preferido" para usar? ¿O hay casos en que uno debe usarse sobre el otro?

Sí. Si está insertando valores en la base de datos, puede usar INSERT . Si la columna no existe, se creará para usted. De lo contrario, el efecto de INSERT es similar a UPDATE . INSERT es útil cuando no tiene un esquema prediseñado (Familia de columnas dinámicas, es decir, inserte cualquier cosa, en cualquier momento). Si está diseñando el esquema de antemano (Familia de columnas estáticas, similar a RDMS) y conoce cada columna, puede usar UPDATE .


Otra diferencia sutil (estoy empezando a creer que cql es una interfaz terrible para cassandra, llena de sutilezas y advertencias debido al uso de sintaxis SQL similar pero semántica ligeramente diferente) es con la configuración de TTL en los datos existentes. Con UPDATE no puede actualizar el TTL de las claves, incluso si los nuevos valores reales son iguales a los valores anteriores. La solución es INSERTAR la nueva fila en su lugar, con el nuevo TTL ya configurado