问题描述
我要确保只有一个记录具有column1和column2值(column1 + column2是唯一的)。
如果已经存在记录,且列1 = v1和列2 = v2,那么我想选择ID或插入列1 = v1和列2 = v2的记录。我不想先选择然后检查然后插入,因为可能会出现2个请求同时带有相同值的情况,这两个请求都应该成功,但是在数据库中应该只创建一条记录,之后我需要Id在两个请求中。
数据库:Postgres
解决方法
我认为您所描述的逻辑是尝试插入的语句,在有重复的情况下跳过该语句,并在两种情况下都返回相应的id
(无论插入是否实际发生)。>
为此,您需要在col1和col2上设置一个唯一键,因此不允许重复。您的create table
语句如下:
create table mytable (
id serial primary key,col1 text,col2 text,unique (col1,col2)
);
然后,您可以编写返回的插入查询,如下所示:
with
-- query parameters
params as (select $1 col1,$2 col2),-- insert,or skip if the row already exists
ins as (
insert into mytable (col1,col2)
select * from params
on conflict (col1,col2) do nothing
)
-- return the id
select t.id
from mytable t
inner join params p on p.col1 = t.co1 and p.col2 = t.col2