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( ...
随机推荐
- Win10《芒果TV - Preview》官方指定预览版 - 重要使用注意事项
Win10<芒果TV - Preview>官方指定预览版,最新的改进和功能更新将会此版本优先体验. 重要使用注意事项: 1.因为方便过审核,默认将会员相关的操作提示简化: 2.使用中务必手 ...
- mfc动态显示图片
参考:https://blog.csdn.net/pudongdong/article/details/69396600 之前写过win32动态显示图片的博客,这次用到了mfc.原理是一样的. OnI ...
- 零元学Expression Blend 4 - Chapter 40 Flash做的到的Blend也可以!轻松制作拥有动画的MenuBar!(上)
原文:零元学Expression Blend 4 - Chapter 40 Flash做的到的Blend也可以!轻松制作拥有动画的MenuBar!(上) 一直以来都有人拿Flash的动画问我Blend ...
- Python日记:基于Scrapy的爬虫实现
安装 pywin32 和python版本一致 地址 https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/安装过程中提示 ...
- ASP.NET Core Linux 发布
这篇博客参考了以下文章: 1.http://www.cnblogs.com/ants/p/5732337.html 2.http://www.linuxidc.com/Linux/2016-11/13 ...
- QT中的各种对话框
大家可以参见QT中各种MessageBox的使用的这篇文章 界面效果图如下,大家可以用代码自己操作 diglog.h #ifndef DIALOG_H #define DIALOG_H #includ ...
- Aria2在Windows上如何安装配置使用
一.下载所需的软件 二.安装与使用 三.Aria2的额外内容 四.Aria2的使用 五.Aria2与其它插件配合使用 一.下载所需的软件 可以从一下地址获取最新版本 GitHub: https://g ...
- 编译 Qt 5.6(使QtWebEngine支持XP)
说明 qt 5.6的编译进行了数十遍,才得出本文的可行方案,之所以花了这么多的时间,主要是qt引入了QtWebEngine模块后,导致编译难度直线上升,而且又有一些中国特色的问题(如360安全卫士)导 ...
- Python连载8-datetime包函数介绍
一.datetime包(上接连载7内容) 1.函数:datetime (1)用法:输入一个日期,来返回一个datetime类 (2)格式:datetime.datetime(年,月,日,hour=, ...
- Netty源码分析--创建Channel(三)
恩~,没错,其实这一篇才是真正的开始分析源码,你打我呀~. 先看一下我Netty的启动类 private void start() throws Exception { EventLoopGroup ...