2013-11-01 194 views
2

我通过从表中选择数据并插入到另一个表中来更新数据。但也有在其他表中的一些约束,我得到这个:将数据从一个表复制到另一个表

DETAIL: Key (entry_id)=(391) is duplicated. 

我基本上做到这一点:

insert into table_tmp 
select * from table_one 

我怎么能跳过插入时,该键输入重复的发生?

更新我无法保存在SQL小提琴此架构的信息,但在这里它是:

CREATE TABLE table1 
    ("entry_id" int, "text" varchar(255)) 
; 

INSERT INTO table1 
    ("entry_id", "text") 
VALUES 
    (1, 'one'), 
    (2, 'two'), 
    (3, 'test'), 
    (3, 'test'), 
    (12, 'three'), 
    (13, 'four') 
; 



CREATE TABLE table2 
    ("entry_id" int, "text" varchar(255)) 
; 

Create unique index entry_id_idxs 
on table2 (entry_id) 
where text='test'; 

INSERT INTO table2 
    ("entry_id", "text") 
VALUES 
    (1, 'one'), 
    (2, 'two'), 
    (3, 'test'), 
    (3, 'test'), 
    (12, 'three'), 
    (13, 'four') 
; 

错误,我得到的,如果我尝试建立架构

+0

你是否用WHERE约束创建唯一索引?为什么?这没有任何意义。请从索引创建中删除WHERE。 – mvp

回答

2

插入使用连接返回不匹配的行:

INSERT INTO table2 
SELECT DISTINCT t1.* 
FROM table1 t1 
LEFT JOIN table2 t2 ON t2.entry_id = t1.entry_id 
WHERE t2.entry_id IS NULL 
+0

谢谢你的答案波希米亚人,这次我得到另一个错误: '错误:重复键值违反唯一约束“entry_id_idx”' –

+0

请参阅我的更新 –

+0

我添加了'DISTINCT'关键字 - 看看是否有帮助。顺便说一句,你的例子不会建立(在sqlfiddle),因为table2开始与重复 - 你需要删除其中一个id = 3插入到table2。还要为table1添加一个不同的值以使示例有意义。 – Bohemian

2

使用此查询 - SQLFiddle Demo

INSERT INTO table2 
SELECT t1.* FROM table1 t1 
WHERE NOT EXISTS (
    SELECT entry_id 
    FROM table2 t2 
    WHERE t2.entry_id = t1.entry_id 
) 
+0

同意,如果性能是一个问题,我会使用左连接。 – CaveCoder

+0

只要在这两个表中的'entry_id'上有一个索引,此查询就会工作得很快。 – mvp

+0

从检查网页我相信postgres在这两种情况下都表现平等。我很抱歉,我本人不是一个postgres人! http://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/ – CaveCoder

相关问题