将唯一值插入postgresql

时间:2016-02-01 12:14:26

标签: sql sql-insert postgresql-9.3

我在postgresql中使用下面的命令创建一个表。

CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
);

然后执行2个插入语句。

  1. insert into someTable (col1,col2) values(1,11),(1,12);

    其工作

  2. insert into someTable (col1,col2) values(1,13),(1,14),(1,11);

    出错(键(col1,col2)=(1,11)已存在。

  3. 但我需要避免重复对。怎么可能?

    我试试

    x86_64-pc-linux-gnu上的PostgreSQL 9.5.0,由gcc编译的gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2,64位和PostgreSQL 9.3在x86_64-pc-linux-gnu上编译,由gcc编译( Ubuntu 4.8.2-19ubuntu1)4.8.2,64位

    但我收到了错误

    在执行两个语句后,我需要这样做。

    (1,11),(1,12),(1,13),(1,14)
    

2 个答案:

答案 0 :(得分:3)

您可以使用insert . . . select

执行此操作
insert into someTable(col1, col2) 
    select col1, col2
    from (select 1 as col1, 13 as col2 union all
          select 1, 14 union all
          select 1, 11
         ) t
    where not exists (select 1
                      from someTable st
                      where st.col1 = t.col1 and st.col2 = t.col2
                     );

即,在insert之前过滤掉值。

编辑:

作为一个没有名字的马,你也可以写成:

insert into someTable(col1, col2) 
    select col1, col2
    from (values (1, 13), (1, 14), (1, 11)
         ) as t(col1, col2)
    where not exists (select 1
                      from someTable st
                      where st.col1 = t.col1 and st.col2 = t.col2
                     );

我倾向于使用union all方法,因为并非所有数据库都支持使用values()语句。

答案 1 :(得分:3)

使用postgresql 9.5(最新版本)

使用像这样的查询

insert into someTable (col1,col2) values(1,13),(1,14),(1,11) ON CONFLICT DO NOTHING;

如果没有任何额外的代码,它将避免重复。