我有一个像这样创建的表:
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,否则将其插入值以创建新行"。
答案 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'在同一时间。