我有一个名为employee_Details的表名,带有列
EMP_ID NAME VECH_NO SALARY
1 A 1234 100
2 B 12345 200
我使用Java构造JSON数组。结构
{[ “EMP_ID”:1, “NAME”:Y, “VECH_NO”:4587, “工资”:1500],[ “EMP_ID”:3, “NAME”:Z, “VECH_NO”:4007,” SALARY“:1800]}
我需要更新表上存在EMP_ID的完整记录,否则插入新记录。 postgreSQL中有任何构建函数可用于实现此目的。我引用这个https://www.postgresql.org/docs/9.3/static/functions-json.html但没有得到解决方案
答案 0 :(得分:3)
首先,您的JSON格式不正确,我想其目的是:
[
{"EMP_ID":1,"NAME":"Y","VECH_NO":4587,"SALARY":1500},
{"EMP_ID":3,"NAME":"Z","VECH_NO":4007,"SALARY":1800}
]
假设以下表格定义:
CREATE TEMP TABLE employee_details(
"EMP_ID" integer primary key,
"NAME" text,
"VECH_NO" integer,
"SALARY" numeric
);
示例数据(仅显示更新):
INSERT INTO employee_details VALUES(1, 'X', 123, 123);
SELECT r.*
FROM
json_array_elements('[{"EMP_ID":1,"NAME":"Y","VECH_NO":4587,"SALARY":1500},{"EMP_ID":3,"NAME":"Z","VECH_NO":4007,"SALARY":1800}]') AS a(element),
json_populate_record(NULL::employee_details, a.element) AS r;
有了这个,您可以简单地使用INSERT ... ON CONFLICT UPDATE
:
INSERT INTO employee_details("EMP_ID", "NAME", "VECH_NO", "SALARY")
(
SELECT r."EMP_ID", r."NAME", r."VECH_NO", r."SALARY"
FROM
json_array_elements('[{"EMP_ID":1,"NAME":"Y","VECH_NO":4587,"SALARY":1500},{"EMP_ID":3,"NAME":"Z","VECH_NO":4007,"SALARY":1800}]') AS a(element),
json_populate_record(NULL::employee_details, a.element) AS r
)
ON CONFLICT ("EMP_ID") DO
UPDATE SET
"NAME" = EXCLUDED."NAME",
"VECH_NO" = EXCLUDED."VECH_NO",
"SALARY" = EXCLUDED."SALARY"
;
ON CONFLICT
子句仅适用于9.5或更高版本。在此之前,您必须使用some tricks with loop and retry或可写的公用表表达式(尽管存在竞争条件问题);无论如何,如果您使用的是旧版本,则升级是一个很好的理由。