8

所以我来自 MySQL,我可以在 DUPLICATE UPDATE 上进行 INSERT

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

但是现在我正在使用 PostgreSQL,并且正在努力添加 UPSERT 功能,看起来 MERGE 可能适用于我想要的,但想看看这是否是最优化的语法。示例语法 1我也见过这个,但不明白如何实现。我还没有尝试过,因为我认为 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

4 回答 4

14

在 MERGE 可用之前,请使用这种强大的方法:在 PostgreSQL 中重复更新时插入?

于 2010-12-30T01:33:20.590 回答
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 将更改为适当的条件。

于 2010-12-29T23:22:58.123 回答
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

于 2010-12-29T17:26:50.543 回答
0

我认为 Postgres 中还没有“MERGE”,但应该在 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 中调用过程。

于 2010-12-29T19:12:30.067 回答