仅当值不存在时才从 SELECT 插入到 table

INSERT into a table from SELECT only if value doesn't exist

我想将 table1.id 插入到 table2.t1col 中,仅当 table1.id 不存在于 table2.t1col 中时。

我想我必须使用:

insert into table2 name (t1col) value (select id from table1)

但我只想在 table2 中不存在 id 的情况下添加。

在该列上创建一个唯一索引并完成它。不用查了。

CREATE UNIQUE INDEX name ON table (column [, ...]);

http://www.postgresql.org/docs/9.4/static/indexes-unique.html

您可以使用唯一索引来防止重复的行。

但是如果你想插入行过滤它不插入重复的行,你可以这样做。

INSERT INTO table2 (idcol)
SELECT id FROM table1
EXCEPT
SELECT idcol FROM table2;

unique/index 约束保证值的唯一性。所以,推荐。

不幸的是,违反约束会导致整个 insert 失败。所以,你可以这样做:

insert into table2(t1col) 
    select id
    from table1 t1
    where not exists (select 1 from table2 t2 where t2.t1col = t1.id);

你也应该有一个独特的index/constraint,以防止将来出现问题。

使用这个查询

INSERT INTO table2 name (t1col) value 
(
    SELECT t1.id FROM table1 t1, table2 t2
    WHERE t1.id <> t2.id
)

如果您对 table2.t1colUNIQUEPRIMARY KEY 约束,就像您最可能应该做的那样,Postgres 9.5(目前是测试版,很快就会发布)。使用新的 UPSERT 实现 INSERT ... ON CONFLICT DO NOTINGQuoting the manual:

The optional ON CONFLICT clause specifies an alternative action to raising a unique violation or exclusion constraint violation error. For each individual row proposed for insertion, either the insertion proceeds, or, if an arbiter constraint or index specified by conflict_target is violated, the alternative conflict_action is taken. ON CONFLICT DO NOTHING simply avoids inserting a row as its alternative action.

大胆强调我的。

所以你可以简单地:

INSERT INTO table2(t1col)
SELECT id FROM table1
ON CONFLICT DO NOTHING;

如果 table1.id 未定义为唯一,使其 唯一:

INSERT INTO table2(t1col)
SELECT DISTINCT id FROM table1
ON CONFLICT DO NOTHING;

对于 Postgres 9.4,您可以在此处找到技术概述:

  • Select rows which are not present in other table.