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

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

虽然这样做有效,但它也会在每次插入失败时增加主键的顺序。
是否可以重写查询,使第一个操作成为更新,并且只有在没有执行更新时才会执行插入?

最佳答案

我不知道该命令的内置命令,但您可以为此编写存储过程:

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

关于sql - PostgreSQL:递增,否则插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49473291/

10-16 13:52
查看更多