CitusDB UPSERT
CitusDB的upsert功能
postgresql9.5 版本支持 "UPSERT" 特性, 这个特性支持 INSERT 语句定义 ON CONFLICT DO UPDATE/IGNORE 属性,当插入 SQL 违反约束的情况下定义动作,而不抛出错误。
环境
citus62_96(默认安装的postgresql9.6)
$ psql -V
psql (PostgreSQL) 9.6.3
测试
$ sudo -i -u postgres psql
postgres=# create table test(id int,name text,city text);
CREATE TABLE
# 创建唯一约束
postgres=# ALTER TABLE test ADD CONSTRAINT name_city UNIQUE (name, city);
ALTER TABLE
# 创建以name做hash的分片表
postgres=# select create_distributed_table('test','name');
create_distributed_table
--------------------------
(1 row)
postgres=# insert into test values (1,'li','beijing');
INSERT 0 1
postgres=# INSERT INTO test (id, name, city) VALUES (1,'li','shanghai') on CONFLICT (name, city) DO UPDATE SET id = test.id + EXCLUDED.id;
INSERT 0 1
postgres=# select * from test;
id | name | city
----+------+----------
1 | li | beijing
1 | li | shanghai
(2 rows)
postgres=# INSERT INTO test (id, name, city) VALUES (2,'li','shanghai') on CONFLICT (name, city) DO UPDATE SET id = test.id + EXCLUDED.id;
INSERT 0 1
postgres=# select * from test;
id | name | city
----+------+----------
1 | li | beijing
3 | li | shanghai
(2 rows)
备注:定义 ON CONFLICT属性后,已有的用户只需更新id值(可以从上看出,只有2个约束name,city都相等时,才会更新id值,否则会增加一行)。EXCLUDED 为试图插入的值。
postgres=# create table test1(id int,name text,city text);
CREATE TABLE
postgres=# ALTER TABLE test1 ADD CONSTRAINT name UNIQUE (name);
ALTER TABLE
postgres=# select create_distributed_table('test1','name');
create_distributed_table
--------------------------
(1 row)
postgres=# insert into test1 values (1,'li','beijing');
INSERT 0 1
postgres=# INSERT INTO test1 (id, name, city) VALUES (2,'wang','nanjing') on CONFLICT (name) DO UPDATE SET id = test1.id + EXCLUDED.id;
INSERT 0 1
postgres=# select * from test1;
id | name | city
----+------+---------
1 | li | beijing
2 | wang | nanjing
(2 rows)
postgres=# INSERT INTO test1 (id, name, city) VALUES (1,'wang','nan') on CONFLICT (name) DO UPDATE SET id = test1.id + EXCLUDED.id;
INSERT 0 1
postgres=# select * from test1;
id | name | city
----+------+---------
1 | li | beijing
3 | wang | nanjing
(2 rows)
备注:可以从上看出,只要满足约束name相同,id值被更新,其他字段city若不相同则数据库中还是原来city值。
CitusDB UPSERT的更多相关文章
- mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)
主从复制:http://blog.csdn.net/drifterj/article/details/7833883 对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能 ...
- Perform UPSERT / INSERT OR UPDATE against a SQLite Database
Option 1: You can afford deleting the row In other words, you don't have foreign key, or if you have ...
- 数据库的发展现状与前景——NewSQL界的佼佼者,如Couchbase、Aerospike、Marklogic和 SequoiaDB,NewSQL的许多厂商,如:MemSQL、VoltDB、ScaleDB和CitusDB
转自:http://news.sequoiadb.com/cn/Detail-id-42 2015-03-20 Strata+Hadoop World(SHW)大会是全世界最大的大数据大会之一. ...
- MongoDB的upsert状态判断和pymongo使用方法
在mongo中,有一个命令非常的方便,就是upsert,顾名思义就是update+insert的作用 根据条件判断有无记录,有的话就更新记录,没有的话就插入一条记录 upsert的使用方法: Mong ...
- Postgresql插入或更新操作upsert
幂等性的一个要求是多次操作的结果一致.对于update操作,多次直接的结果都是最后update的值,是满足需求的. 但对于insert,如果已经插入,第二次会报错,duplicate error, 主 ...
- MongoDB 的 upsert
MongoDB 的update 方法的三个参数是upsert,这个参数是个布尔类型,默认是false.当它为true的时候,update方法会首先查找与第一个参数匹配的记录,在用第二个参数更新之,如果 ...
- Phoenix系列:原子的Upsert
Phoenix的插入语句是Upsert,Update和Insert的组合语义.即,如果数据表中没有这条记录那么插入这条记录,如果有则更新.判断是否存在相同的数据是使用ON DUPLICATE KEY来 ...
- MongoDB-Java的两个基本操作Upsert和insertMany
此文只是为了记录几个基本操作,首先Upsert,有多种方法可以进行,但是都需要指定UpdateOptions.upsert(true),其中最简单的办法如下(eqq是一个用来filter的BSON,具 ...
- 当update的查询条件是数组的时候,upsert会失效
不管是findOneAndUpdate还是update方法,只要他们的查询条件是数组,upsert就会失效,比如: //这段代码只会更新已存在的数据,不存在的不会插入 tagModel.update( ...
随机推荐
- Windows10 【系统周期表】【系统下载表】【大型软件表】
系统周期表 商用名称 商用英文名 代号 版本 系统版本 上市日期 服务周期 备注 Windows 10 无 Threshold 1 1507 10.0.10240.17443 2015.07.29 2 ...
- C#获取字符串宽度像素
通过Graphics对象的MeasureString方法可以获取字符串的大小,如下: Graphics graphics = CreateGraphics(); SizeF sizeF = graph ...
- Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法
原文:Advanced Installer读取注册表时将Program Files读取为Program Files (x86)的解决办法 今天同事在做安装包的时候,有一个读取注册表路径的需求,需要根据 ...
- asp.net core2.0中网站发布的时候,视图文件不被打包成dll
项目csproj文件里面加 <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <Target ...
- ASP.NET MVC5快速入门--MyFirstWeb并发布到Windows Azure上
博主刚刚学习ASP.NET MVC5,看着微软的文档一点点学,就把FirstWeb的建立展示一下下啦,本次建立一个带个人身份验证的例子(即有注册登录机制的动态网页),开始,啦啦啦~~ 新建一个项目,选 ...
- Qt:正确判断文件、文件夹是否存在的方法
一直对Qt的isFile.isDir.exists这几个方法感到混乱,不知道到底用哪个,网上搜了下资料,也是用这几个方法但是都没有对其深究,经过测试发现会存在问题,先看看下面的测试代码 { QFile ...
- Qt常见皮肤qss代码(有Metro的风格)
##QTabWidget 淡蓝色效果TabWidget(属性值lightblue) QTabWidget[lightblue = "true"] QTabBar::tab{ bor ...
- 使用Func<T1, T2, TResult> 委托返回匿名对象
Func<T1, T2, TResult> 委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的方法. 语法 public delegate TResult Func< ...
- vue-cli脚手架 ,过滤器,生命周期钩子函数
一.安装vue-cli脚手架 1.淘宝镜像下载 用淘宝的国内服务器来向国外的服务器请求,我们向淘宝请求,而不是由我们直接向国外的服务器请求,会大大提升请求速度,使用时,将所有的npm命令换成cnpm即 ...
- 【搜索引擎】Solr全文检索近实时查询优化
设置多个搜索建议查找算法 <searchComponent name="suggest" class="solr.SuggestComponent"> ...