我希望table1.id
仅在table2.t1col
中不存在table1.id
的情况下插入table2.t1col
。
我想我必须使用:
insert into table2 name (t1col) value (select id from table1)
但我想仅在id
中不存在table2
时添加。
答案 0 :(得分:2)
唯一/索引约束保证了值的唯一性。因此,建议使用。
不幸的是,违反约束会导致整个insert
失败。所以,你可以这样做:
insert into table2(t1col)
select id
from table1 t1
where not exists (select 1 from table2 t2 where t2.t1col = t1.id);
您还应该有一个唯一的索引/约束来防止将来出现问题。
答案 1 :(得分:1)
您可以使用唯一索引来防止重复的行。
但是如果你想插入过滤它的行来不插入重复的行,你可以这样做。
INSERT INTO table2 (idcol)
SELECT id FROM table1
EXCEPT
SELECT idcol FROM table2;
答案 2 :(得分:1)
如果您UNIQUE
上有PRIMARY KEY
或table2.t1col
约束,就像您最有可能的那样, Postgres 9.5 (目前有更优雅的解决方案)测试版,现在很快发布)。使用新的UPSERT实施INSERT ... ON CONFLICT DO NOTING
。 Quoting the manual:
可选的
ON CONFLICT
子句指定了替代操作 提出唯一违规或排除约束违规错误。 对于建议插入的每个单独行,要么插入 收益,或者,如果由仲裁者约束或指数指定 违反了conflict_target
,采取了替代性的conflict_action。ON CONFLICT DO NOTHING
只是避免插入行作为替代操作。
大胆强调我的。
所以你可以简单地说:
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 ,您可以在此处找到技术概述:
答案 3 :(得分:0)
在该列上创建一个唯一索引并完成它。无需检查。
class extends React.Component
http://www.postgresql.org/docs/9.4/static/indexes-unique.html
答案 4 :(得分:-1)
使用此查询
INSERT INTO table2 name (t1col) value
(
SELECT t1.id FROM table1 t1, table2 t2
WHERE t1.id <> t2.id
)