我不知道这是文档中的错误,功能还是问题。
我们说我有这张桌子:
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 同时使用两者,有没有人发现同样的问题并解决了它?
答案 0 :(得分:2)
文档是正确的,没有错误。你忽略了这一部分:
可选的RETURNING子句导致INSERT根据 实际插入(或更新)的每一行来计算和返回值,如果是使用了CONFLICT DO UPDATE子句)
(强调我的)
如果指定DO NOTHING
,则该语句既不会插入也不会更新任何内容,因此无法返回ID。