[cassandra] 카산드라에서 UPDATE와 INSERT의 차이점은 무엇입니까?


1 Answers

미묘한 차이가 있습니다. 키가 아닌 모든 필드를 null로 설정하면 INSERT를 통해 삽입 된 레코드가 유지됩니다. 키가 아닌 모든 필드를 null로 설정하면 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

Cassandra-cli를 사용하여 이들을 보면, 행이 추가되는 방식이 다른 것을 볼 수 있습니다.

나는 그것이 설계 상 또는 버그인지를 확인하고이 행동이 문서화되어 있음을 알고 싶을 것이다.

Question

Cassandra에 대해 CQL을 실행할 때 UPDATEINSERT 의 차이점은 무엇입니까?

아무런 차이가 없었던 것처럼 보였지만 지금은 documentationUPDATE 가 수행하는 동안 INSERT 가 카운터를 지원하지 않는다고 말합니다.

"선호하는"방법을 사용할 수 있습니까? 또는 하나를 다른 것 위에 사용해야하는 경우가 있습니까?

정말 고마워!




billbaird가 강조한 미묘한 차이점 (해당 게시물에 직접 언급 할 수 없음)과 관련하여 키 필드가 아닌 모든 필드가 null 인 경우 업데이트 작업으로 만들어진 행이 삭제됩니다.

이는 예상되는 동작이며 issues.apache.org/jira/browse/CASSANDRA-11805 ( "문제가 아닙니다"로 마감)의 버그 보고서를 기반으로 한 버그가 아닙니다.

처음으로 스프링 데이터를 사용할 때 나는이 문제에 스스로 빠졌다. 저장소의 save(T entity) 메소드를 사용했지만 행이 작성되지 않았습니다. 그것은 Spring 데이터가 객체가 'new'가 아니라는 것을 확인했기 때문에 UPDATE 사용하는 것으로 판명되었습니다. ( 'isNew'에 대한 테스트가 여기에 맞는지 확신 할 수 없습니다.) 키 필드가 설정된 엔티티 만 테스트 할 수있었습니다. .

이 Spring 데이터 케이스의 경우, Cassandra 고유의 ​​저장소 인터페이스는 해당 동작이 필요할 경우 INSERT 를 계속 사용하는 insert 메소드를 제공합니다 (Spring의 설명서에는 이러한 세부 사항이 충분히 설명되어 있지 않지만).




Related