我有一些行经常以增量更新,但很少插入。是否可以切换新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/