PostgreSQL:增加否则插入

时间:2018-03-25 06:55:47

标签: sql postgresql

我的行经常以增量更新,但很少插入。是否可以切换新INSERT ... ON CONFLICT语句的顺序以优化更新而不是插入?

现在我正在这样做:

INSERT INTO ?? (??) VALUES (?) ON CONFLICT(??) DO UPDATE SET ?? = ?? + 1 RETURNING ??

虽然这有效,但即使插入失败,它也会每次都增加主键的顺序。

是否可以以第一次操作为更新的方式重写查询,并且只有在没有执行更新时才会执行插入?

1 个答案:

答案 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, ...);