Cassandra docs和blog表示带有条件更新语句的批处理以分区的粒度工作,而分区是由primary key中的第一个键定义的 所以,我有以下键空间:
CREATE TABLE SOCIAL_PROFILE (
soc_net_type text,
soc_net_user_id text,
user_prof_id text,
PRIMARY KEY (soc_net_type, soc_net_user_id));
CREATE TABLE SOCIAL_PROFILE_CONTACT (
soc_prof_soc_net_type text,
soc_prof_soc_net_user_id text,
soc_net_user_id text,
PRIMARY KEY (soc_prof_soc_net_type, soc_prof_soc_net_user_id, soc_net_user_id));
并插入声明:
BEGIN BATCH
INSERT INTO social_profile (soc_net_type, soc_net_user_id, user_prof_id) VALUES ('vk', '1', '100') IF NOT EXISTS;
INSERT INTO social_profile_contact (soc_prof_soc_net_type, soc_prof_soc_net_user_id, soc_net_user_id) VALUES ('vk', '1', '2');
INSERT INTO social_profile_contact (soc_prof_soc_net_type, soc_prof_soc_net_user_id, soc_net_user_id) VALUES ('vk', '1', '3');
INSERT INTO social_profile_contact (soc_prof_soc_net_type, soc_prof_soc_net_user_id, soc_net_user_id) VALUES ('vk', '1', '4');
APPLY BATCH;
而social_profile_contact.soc_prof_soc_net_type = social_profile.soc_net_type它们都具有相同的值,应该在同一个分区中,但Cassandra会抛出: 错误请求:具有条件的批处理不能跨越多个表
我还没有找到关于文档中的表格,我做错了什么?
cqlsh 4.1.1 | Cassandra 2.0.11 | CQL规范3.1.1 |节俭协议19.39.0
答案 0 :(得分:5)
"具有条件的批处理不能跨越多个表"
使用相同主键的两个不同列系列(表)仍然是两个不同的分区。
答案 1 :(得分:1)
您需要在独立批次中使用IF NOT EXISTS移动语句。 INSERT INTO social_profile(soc_net_type,soc_net_user_id,user_prof_id)VALUES('vk','1','100')IF NOT NOT EXISTS;
带有条件IF NOT NOT EXISTS的批量插入只能包含单一类型。