【发布时间】:2017-03-12 10:49:43
【问题描述】:
我有一种情况,我经常需要从具有唯一约束的表中获取一行,如果不存在,则创建它并返回。 例如我的表可能是:
CREATE TABLE names(
id SERIAL PRIMARY KEY,
name TEXT,
CONSTRAINT names_name_key UNIQUE (name)
);
它包含:
id | name
1 | bob
2 | alice
那我想:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT DO NOTHING RETURNING id;
或许:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT (name) DO NOTHING RETURNING id
并让它返回 bob 的 ID 1。但是,RETURNING 仅返回插入或更新的行。所以,在上面的例子中,它不会返回任何东西。为了让它按需要运行,我实际上需要:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;
这似乎有点麻烦。我想我的问题是:
不允许(我的)期望行为的原因是什么?
有没有更优雅的方法来做到这一点?
【问题讨论】:
标签: sql postgresql upsert postgresql-9.5