MERGE语法用于在重复UPDATE上进行UPSERT或INSERT

时间:2010-12-29 16:46:57

标签: postgresql upsert sql

所以我来自MySQL我可以做INSERT on DUPLICATE UPDATE

INSERT INTO table (a,b,c) 
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

但是现在我正在使用PostgreSQL,并且努力添加UPSERT功能,看起来MERGE可能适用于我想要的但想看看这是否是最佳语法。 Example Syntax 1I've also seen this but don't understand how to implement。我还没有尝试过这个,因为我认为MERGE用于合并从table1到Table2的数据或者这样的工作会不会这样?

MERGE
INTO    table
USING   table
ON      c = 1
WHEN MATCHED THEN
UPDATE
SET     c=c+1
WHEN NOT MATCHED THEN
INSERT  (a,b,c)
VALUES  (1,2,3)

还有其他建议吗?

4 个答案:

答案 0 :(得分:13)

在MERGE可用之前,请使用这种强大的方法:Insert, on duplicate update in PostgreSQL?

答案 1 :(得分:3)

在支持合并之前,IMO最简单的方法是将其分解为两个查询:

BEGIN;
  INSERT INTO t (a,b,c) VALUES (1,2,3) WHERE id != 1;
  UPDATE t SET c=c+1 WHERE id = 1;
END;

其中id将更改为适当的条件。

答案 2 :(得分:0)

MERGE INTO table
    USING (VALUES (1, 2, 3)) AS newvalues (a, b, c)
    ON table.c = newvalues.c  -- or whatever the PK is
    WHEN MATCHED THEN UPDATE SET c = c + 1
    WHEN NOT MATCHED THEN INSERT (a, b, c)
                              VALUES (newvalues.a, newvalues.b, newvalues.c)

这里的关键是,不是在另一个表中合并,而是使用VALUES子句中的USING构造创建一个常量表源。精确的合并规则,你可以明显地量身定做。

另见http://petereisentraut.blogspot.com/2010/05/merge-syntax.html

答案 3 :(得分:0)

我认为“MERGE”还没有出现在Postgres中,但却被认为是9.1。

我喜欢使用RULE代替

CREATE OR REPLACE RULE "insert_ignore"
AS ON INSERT TO "table" WHERE
  NEW.id = OLD.id --whatever your conditions are
DO INSTEAD NOTHING;

您链接到的内容(“插入,重复更新(postgresql)”)基本上是您提供数据的一些pgsql。我认为RULE更优雅,因为你不需要明确地调用它们,并且它们在后台工作透明而不需要在实际的INSERT中调用过程。