2017-11-24 27 views
0

CQL을 처음 사용합니다. 나는 UDT를 실험 해본 결과이 문제를 보았습니다.CQL : 사용자 정의 형식 내에서 특정 데이터 변경

사용자 정의 유형을 만들고 테이블에 새 행을 추가하면 모든 필드를 다시 정의 할 필요없이 필드를 업데이트 할 수있는 방법이 있습니까? 그들? 다음과 같이

create type favorites(
color text, 
number int, 
food text, 
location set<text> 
); 

나는 테이블에 새 값을 삽입 : 예를 들어, 내가 이름 (텍스트, 기본 키) 및 다음과 같은 형식의 사용자 정의 형식으로 구성된 테스트라는 테이블이

insert into test(name, favorite_stuff) values(
'Spongebob', 
{color:'yellow', number: 12, food:'krabby patty', location:{'bikini bottom', 'goo lagoon'}} 
); 

이제 Spongebob의 가장 좋아하는 색을 '분홍색'으로 변경하고 'glove world'를 즐겨 찾는 위치 목록에 추가하고 싶습니다. 이 작업을 수행하는 방법을 아는 유일한 방법은 문자 그대로 모든 것을 재정의하는 것입니다.

update test 
set favorite_stuff = { 
color:'pink', 
number:12, 
food:'krabby patty', 
location:{'bikini bottom', 'goo lagoon', 'glove world'} 
} where name='Spongebob'; 

더 좋은 방법이 있나요?

답변

1

테이블 스키마가 CREATE TABLE test(name text primary key, favorite_stuff frozen<favorites>); 인 것으로 가정합니다. favorite_stuff 은 냉동해야 함 중첩되지 않은 고정 콜렉션이있는 비 고정 UDT는 cassandra에서 지원되지 않습니다. 이 스키마를 사용하면 아래의 이유로 인해 부분 업데이트를 수행 할 수 없습니다.

고정 값은 여러 구성 요소를 단일 값으로 직렬화합니다. 고정되지 않은 유형은 개별 필드에 대한 업데이트를 허용합니다. Cassandra는 고정 유형의 값을 얼룩으로 처리합니다. 전체 값을 덮어 써야합니다.

그러나 다음과 같이 즐겨 찾기 유형 스키마를 변경할 수 있습니다. 그러면 개별 저작물을 업데이트 할 수 있습니다 (위치가 고정되어 있으므로 위치 속성이 아님).

create type favorites(
    color text, 
    number int, 
    food text, 
    location frozen<set<text>> 
); 


cqlsh:test> update test set favorite_stuff.color='pink' where name='Spongebob'; 
cqlsh:test> select * from test; 

name  | favorite_stuff 
-----------+---------------------------------------------------------------------------------------------- 
Spongebob | {color: 'pink', number: 12, food: 'krabby patty', location: {'bikini bottom', 'goo lagoon'}} 

(1 rows) 
cqlsh:test>