我在postgresql中使用下面的命令创建一个表。
CREATE TABLE someTable (
id serial primary key,
col1 int NOT NULL,
col2 int NOT NULL,
unique (col1, col2)
);
然后执行2个插入语句。
insert into someTable (col1,col2) values(1,11),(1,12);
其工作
insert into someTable (col1,col2) values(1,13),(1,14),(1,11);
出错(键(col1,col2)=(1,11)已存在。
但我需要避免重复对。怎么可能?
我试试
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)
答案 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;
如果没有任何额外的代码,它将避免重复。