我使用Postgresql 9.0,我有一个只有一个人造键(自动递增序列)和另一个唯一键的表。 (是的,这个表有一个原因:))我想通过另一个键查找一个ID,或者如果不存在,插入它:
SELECT id FROM mytable WHERE other_key = 'SOMETHING'
那么,如果不匹配:
INSERT INTO mytable (other_key) VALUES ('SOMETHING') RETURNING id
问题是:可以通过在一个语句中进行这两个操作来保存DB的往返吗?如果不存在,我可以插入行:
INSERT INTO mytable (other_key) SELECT 'SOMETHING' WHERE NOT EXISTS (SELECT * FROM mytable WHERE other_key = 'SOMETHING') RETURNING id
…但是没有给出现有行的ID。有任何想法吗?对other_key有一个独特的约束,如果这有帮助。
你试过联合吗?
原文链接:https://www.f2er.com/postgresql/193164.html编辑 – 这要求Postgres 9.1:
create table mytable (id serial primary key,other_key varchar not null unique); WITH new_row AS ( INSERT INTO mytable (other_key) SELECT 'SOMETHING' WHERE NOT EXISTS (SELECT * FROM mytable WHERE other_key = 'SOMETHING') RETURNING * ) SELECT * FROM new_row UNION SELECT * FROM mytable WHERE other_key = 'SOMETHING';
结果是:
id | other_key ----+----------- 1 | SOMETHING (1 row)