目前支持按照string类型的列进行更新
20.1. 注意事项
1:数据类型需是text类型,不能有分词
2:该列需要通过 key 'unique'进行标记
3:一张表中只能有一个unique的列,且该列必须索引
4:更新模式的性能会比无更新模式性能差,主要表现在会有标记删除的IO,以及更新先后顺序的等待,而无更新模式是完全无锁的
20.2. 建表例子
CREATE FOREIGN TABLE lxdb_key_val (
ukey text OPTIONS(key 'unique', store 'is'), --更新的主键设置
i1 int, i2 int,txt1 text,txt2 text
) SERVER lxdb options(store 'is');
20.3. 创建分片
切记分片列与主键必须相同
select create_distributed_table('lxdb_key_val','ukey','hash','default',10);
20.4. 数据入库
相同主键的数据会按照入库顺序进行覆盖更新
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1111',11, 1, 'txt1', 'txt2');
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1111',12, 2, 'txt2', 'txt2');
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1112',13, 3, 'txt2', 'txt2');
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1112',14, 4, 'txt1', 'txt2');
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1113',15, 5, 'txt1', 'txt2');
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1113',16, 6, 'txt2', 'txt2');
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1114',17, 7, 'txt2', 'txt2');
INSERT INTO lxdb_key_val(ukey,i1, i2, txt1,txt2) VALUES ('1114',18, 8, 'txt1', 'txt2');
20.5. 累加更新
1.上面的更新,需要根据主键覆盖,但存在下述情况,我们可以考虑累加更新
1):后续提供的字段不全,需要在系统里反查出之前的数据,拼装后再写回去
2):需要对数值型进行累加更新
3):对数组类型的列追加一个新的值
2.注意事项:
1):累加更新,目前依赖upmode列才能实现,可以使用的值为replace, upset, incr
2):一旦使用了这个模式,upmode每次必须赋值, 内部为了保证数据一致性,采用了读写锁. 即使是覆盖也要使用,否则内存中不会进行相关cache处理,有可能造成读取不到旧值的问题.
3):要求所有字段必须进行行存储且unique列必须有索引
3.建表语句
注:比覆盖更新多了一个upmode字段
CREATE FOREIGN TABLE lxdb_incr (
upkey text OPTIONS(key 'unique'),
upmode text,
str1 text, i1 bigint,
arr1 int[],arr2 text[]
) SERVER lxdb OPTIONS(store 'ids')
4.创建分片
切记分片列与主键必须相同
select create_distributed_table('lxdb_incr','upkey','hash','default',2);
5.用例1:使用replace覆盖数据
INSERT INTO lxdb_incr (upkey,upmode,str1,i1,arr1,arr2) VALUES
('key1','replace','str1',1,ARRAY[0,1], ARRAY['111','222']);
6.用例2:使用upset替换部分值, arr2值取原来的旧值
INSERT INTO lxdb_incr (upkey,upmode,str1,i1,arr1) VALUES
('key1','upset','str2',1,ARRAY[3,4]);
注:结果为str1,i1,arr1被替换,arr2保留原先的值
7.用例3:使用incr 对i1进行累加
INSERT INTO lxdb_incr (upkey,upmode,i1) VALUES
('key1','incr' ,1);
注:i1的值由原先的1 变更为1+1=2
8.用例4:使用incr对arr1数组进行元素追加
INSERT INTO lxdb_incr (upkey,upmode,arr1) VALUES
('key1','incr', ARRAY[5,6]);
注:arr1的由原来的{3,4} 变更为 {3,4,5,6}