Postgres 上的更新:更新所有字段

Mig*_*lez 5 sql postgresql upsert insert-update

我正在尝试在 postgres 中实现一个 upsert(一个插入约束更新)。这是我的 sql 的样子:

INSERT into "foo" ("bar", "moo", "baz") VALUES (1, 2, 3), (3, 4, 5) 
        ON CONFLICT ON CONSTRAINT "composite_primary_key" DO NOTHING
Run Code Online (Sandbox Code Playgroud)

我想修改 DO NOTHING允许我更新该行的所有字段的内容。我不确定语法应该是什么,因为文档没有解释它,也没有例子可以做到这一点。

谢谢!

Luk*_*der 2

您可以使用魔术EXCLUDED表来访问子句的列VALUES。这样,您就不必在DO UPDATE SET子句中重复这些值本身:

CREATE TABLE t (
  i int,
  j int, 
  k int, 
  l int,
  m int,

  CONSTRAINT composite_primary_key PRIMARY KEY (i, j)
);

INSERT INTO t VALUES (1, 1, 1, 1, 1);

INSERT INTO t VALUES (1, 1, 2, 3, 4), (2, 2, 4, 6, 8) 
ON CONFLICT ON CONSTRAINT composite_primary_key DO UPDATE
SET
  k = excluded.k,
  l = excluded.l,
  m = excluded.m
RETURNING *;
Run Code Online (Sandbox Code Playgroud)

结果是:

|i  |j  |k  |l  |m  |
|---|---|---|---|---|
|1  |1  |2  |3  |4  |
|2  |2  |4  |6  |8  |
Run Code Online (Sandbox Code Playgroud)

它并不像您预期​​的那么强大,但总比没有好,特别是如果您有一个可用的 SQL 构建器,可以根据已知的架构元数据动态地为您生成查询。

更多信息请参见 PG 文档