【发布时间】:2011-10-07 00:46:02
【问题描述】:
我使用的是 PostgreSQL 9.0,并且我有一个表,其中只有一个人工键(自动递增序列)和另一个唯一键。 (是的,这个表是有原因的。:))我想通过另一个键查找一个 ID,或者,如果它不存在,则插入它:
SELECT id
FROM mytable
WHERE other_key = 'SOMETHING'
那么,如果不匹配:
INSERT INTO mytable (other_key)
VALUES ('SOMETHING')
RETURNING id
问题:是否可以通过在一个语句中执行这两项操作来节省到数据库的往返行程?如果它不存在,我可以插入该行:
INSERT INTO mytable (other_key)
SELECT 'SOMETHING'
WHERE NOT EXISTS (SELECT * FROM mytable WHERE other_key = 'SOMETHING')
RETURNING id
... 但这并没有给出现有行的 ID。有任何想法吗?对 other_key 有一个唯一的约束,如果有帮助的话。
【问题讨论】:
-
很遗憾,您曾这么说“此表有理由”同时具有自动递增键和唯一键。如果可能的话,如果使用自动递增代理键,则应该始终拥有一个唯一且非空的键。否则,没有任何东西可以防止重复的真实信息。我并不是说代理键没有它们的用途,但普遍认为两者都有错误的想法是等待发生的数据质量灾难。
-
处理可能的竞争条件的相关答案:stackoverflow.com/questions/15939902/…
标签: postgresql