如何在Postgres 9.5 UPSERT

时间:2016-04-20 10:36:46

标签: postgresql upsert

我不知道这是文档中的错误,功能还是问题。

我们说我有这张桌子:

CREATE TABLE tags(
  id BIGSERIAL PRIMARY KEY,
  value TEXT UNIQUE NOT NULL,
  creation_time TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

如果您运行INSERT INTO tags(value) VALUES('a') RETURNING id;,您将获得新插入值但是的ID:

再次运行它 INSERT INTO tags(value) VALUES('a') ON CONFLICT(value) DO NOTHING RETURNING id将提供 NO ID,这意味着要么是BUG,要么文档错误,因为文档http://www.postgresql.org/docs/9.5/static/sql-insert.html声明:

INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
    [ ON CONFLICT [ conflict_target ] conflict_action ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

这基本上意味着你 CAN 同时使用两者,有没有人发现同样的问题并解决了它?

1 个答案:

答案 0 :(得分:2)

文档是正确的,没有错误。你忽略了这一部分:

  

可选的RETURNING子句导致INSERT根据 实际插入或更新)的每一行来计算和返回值,如果是使用了CONFLICT DO UPDATE子句)

(强调我的)

如果指定DO NOTHING,则该语句既不会插入也不会更新任何内容,因此无法返回ID。