今日遇一问题:
解析cime文件,然后获取数据将数据插入到postgresql中,需要在数据库表中删除与新文件对应的id相同的记录,首先想到的是使用in语句进行条件删除,但是数据过多,可能上百万条数据,使用in语句最多上限是1000,执行多条sql会到处多次访问数据库造成性能降低的情况,一时间毫无办法,昨晚百度查询“postgresql插入时,id存在,就插入数据,不存在,就修改” ,查询到postgresql9.5版本及以上版本支持此sql写法,今日做一测试。
1、使用navicat随意找一张数据库表(包含数据就行),导出建表语句及数据,获得sql脚本;
2、修改sql脚本,将原表表名加上_test,全局替换;
3、在navicat中运行修改并替换后的sql脚本;
4、得到测试用的数据,然后新建一条查询:select * from user_table_name;
5、从查询结果中随意复制几条数据作为测试用;
6、复制的数据,其中一条修改主键值(如果表中不存在此主键,就新增记录),其中一条主键不修改(如果表中存在此主键,就修改其余字段),其余字段进行修改,满足这两个条件,主要是为了测试postgresql数据库9.5upsert新特性;
7、编写upsert语句(这里举例是批量的,符合我本人的现场需求),
INSERT INTO (主键,字段一名称,字段二名称) VALUES (修改后的id, 字段一值, 字段二值), (未修改的id,字段一值, 字段二值) ON CONFLICT(主键) DO UPDATE SET 字段一名称=EXCLUDED.字段一名称,字段二名称=EXCLUDED.字段二名称;
over