如果值存在则返回行,插入otherwises

时间:2015-03-28 02:16:02

标签: sql postgresql

我有一个像这样创建的表:

CREATE TABLE IF NOT EXISTS my_table
     p_id uuid DEFAULT uuid_generate_v4() NOT NULL,
     my_column varchar(250) NOT NULL,
     PRIMARY KEY (p_id),
     CONSTRAINT unique_mycolumn UNIQUE (mycolumn);

如果特定值与my_column中的任何值匹配,我想要做的是返回p_id,但如果没有,则插入该特定值并返回新生成的值。我可以"排序"通过尝试从我的代码中调用相应的查询来查询值来解决这个问题,如果返回null,则插入它,但这是一个相当大的竞争条件,我想在内部执行此操作SQL。我已经看到了很多类似的问题,但鉴于该列的唯一约束,这是不同的。

编辑:这是我想要完成的事情:说我有以下数据:

1 | foo
2 | bar

如果我查询" bar",我想回来2。但是,如果我查询" baz",我希望表格如下所示:

1 | foo
2 | bar
3 | baz

所以我想它会更好地描述为"如果值存在则返回ID,否则将其插入值以创建新行"。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

with ins as (insert into my_table (my_column)
select 'baz' where not exists 
   (select 1 from my_table where my_column = 'baz')
returning p_id)
select p_id from ins
union all 
select p_id from my_table where my_column = 'baz';

但请注意,如果两个交易尝试插入值' baz'在同一时间。