我的行经常以增量更新,但很少插入。是否可以切换新INSERT ... ON CONFLICT
语句的顺序以优化更新而不是插入?
现在我正在这样做:
INSERT INTO ?? (??) VALUES (?) ON CONFLICT(??) DO UPDATE SET ?? = ?? + 1 RETURNING ??
虽然这有效,但即使插入失败,它也会每次都增加主键的顺序。
是否可以以第一次操作为更新的方式重写查询,并且只有在没有执行更新时才会执行插入?
答案 0 :(得分:0)
我知道没有内置命令,但您可以为此编写存储过程:
CREATE OR REPLACE FUNCTION update_or_insert(in_parameter1 INTEGER, ...) RETURNING SETOF my_table AS $$
DECLARE
result my_table%ROWTYPE;
BEGIN
WITH updated_rows AS (
UPDATE my_table SET ... WHERE ... RETURNING *
)
SELECT * INTO result FROM updated_rows;
IF FOUND THEN
RETURN NEXT result;
ELSE
WITH inserted_rows AS (
INSERt INTO my_table (...) VALUES (...) RETURNING *
)
SELECT * INTO result FROM inserted_rows;
RETURN NEXT result;
END IF;
RETURN;
$$ LANGUAGE plpgsql;
您可以按如下方式调用此函数:
SELECT * FROM update_or_insert(123, ...);