带有 WHERE 子句的 PostgreSQL ON CONFLICT

sme*_*dev 8 sql postgresql upsert sql-insert

Postgres 文档使它看起来像 WHERE 子句可以作为 ON CONFLICT 条件:https : //www.postgresql.org/docs/9.5/static/sql-insert.html

我一直无法让它工作(如果可能的话)。这是我尝试过的众多排列之一:

INSERT INTO friends (id, dob, frn, status, "groupId", 
"createdAt", "updatedAt") 
VALUES ('1da04305-68ef-4dc1-be6c-
826ab83a6479', '1937-06-01T08:29:08-07:00', 100001, 'New', 'bc1567bc-
14ff-4ba2-b108-4cb2e0f0f768', NOW(), NOW()) 
ON CONFLICT 
    WHERE frn=100001 DO NOTHING
Run Code Online (Sandbox Code Playgroud)

frn 没有任何约束,所以语法更简单:

ON CONFLICT (frn) DO NOTHING
Run Code Online (Sandbox Code Playgroud)

引发数据库错误。我希望这是一个简单的语法问题。

gwa*_*igh 12

WHERE条款是从属于ON CONFLICT (constraint) DO UPDATE SET ...条款。它只查看在尝试插入时违反指定约束的单行。

一个语法有效的例子:

INSERT INTO friends (
    id, 
    dob, frn, status,
    "groupId", "createdAt", "updatedAt"
) VALUES (
    '1da04305-68ef-4dc1-be6c-826ab83a6479',
    '1937-06-01T08:29:08-07:00', 100001, 'New',
    'bc1567bc-14ff-4ba2-b108-4cb2e0f0f768', NOW(), NOW()
) 
ON CONFLICT ("groupId", frn) DO UPDATE SET
    status='Revised', 
    "updatedAt"=NOW()
WHERE status<>'Deleted';
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可能想将其写为“WHEREfriends.status&lt;&gt;'Deleted'”,[否则](/sf/ask/2546505251/不明确)您很可能会收到“列引用“状态”不明确”错误。 (10认同)