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允许我更新该行的所有字段的内容。我不确定语法应该是什么,因为文档没有解释它,也没有例子可以做到这一点。
谢谢!
您可以使用魔术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 构建器,可以根据已知的架构元数据动态地为您生成查询。