通过单个查询获取或创建记录

问题描述

我有一个表,其列ID为column1,column2。

我要确保只有一个记录具有column1和column2值(column1 + column2是唯一的)。

如果已经存在记录,且列1 = v1和列2 = v2,那么我想选择ID或插入列1 = v1和列2 = v2的记录。我不想先选择然后检查然后插入,因为可能会出现2个请求同时带有相同值的情况,这两个请求都应该成功,但是在数据库中应该只创建一条记录,之后我需要Id在两个请求中。

如何使用单个sql做到这一点?还是还有其他更好的方法

数据库: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