仅当值不存在时才从 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.t1col
有 UNIQUE
或 PRIMARY KEY
约束,就像您最可能应该做的那样,Postgres 9.5(目前是测试版,很快就会发布)。使用新的 UPSERT 实现 INSERT ... ON CONFLICT DO NOTING
。 Quoting 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.
我想将 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.t1col
有 UNIQUE
或 PRIMARY KEY
约束,就像您最可能应该做的那样,Postgres 9.5(目前是测试版,很快就会发布)。使用新的 UPSERT 实现 INSERT ... ON CONFLICT DO NOTING
。 Quoting 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 byconflict_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.