我有一種情況,我經常需要從具有唯一約束的表中獲取一行,如果不存在,則創建它並返回。 例如我的表可能是:從INSERT以ON CONFLICT返回行而無需更新
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
並讓它返回鮑勃的身份證1
。但是,RETURNING
只返回插入或更新的行。所以,在上面的例子中,它不會返回任何東西。爲了讓它的功能如我所願,我實際上需要:
INSERT INTO names(name) VALUES ('bob')
ON CONFLICT ON CONSTRAINT names_name_key DO UPDATE
SET name = 'bob'
RETURNING id;
這似乎有點麻煩。我想我的問題是:
什麼是不允許(我)所需的行爲的原因是什麼?
有沒有更好的方法來做到這一點?
謝謝你的回答!我認爲這似乎是一種「更好」的方式,但我不確定我描述的方法與實際的區別是什麼? – ira
@ira:我在上面添加了更多解釋。 –
@ErwinBrandstetter - 這是否總是返回一個ID?我試過了,它似乎沒有工作 - https://stackoverflow.com/q/46586793/435563 - 也許我做錯了什麼? – shaunc