2016-11-19 129 views
2

我想使用on conflict do update-feature从一个表(“tmp”)插入另一个表(“tbla”)中的数据。 我的代码:Postgres插入到冲突执行更新

INSERT INTO tbla (id, col1, col2, col3) 
SELECT id, col1, col2, col3 FROM tmp 

ON CONFLICT on constraint pkey_tbla DO UPDATE SET col1=tmp.col1 FROM tmp; 

DROP TABLE tmp; 

此代码给我回一个语法错误,在“从TMP中;” 没有FROM有错误:缺少表“tmp”的FROM-clause条目 关于我在做什么错的任何建议?

DB-服务器在本地主机上运行的Windows 7的机器在Postgres 9.5

回答

0

文档“需要注意的是特殊的排除表格来引用最初提议插入值” https://www.postgresql.org/docs/9.5/static/sql-insert.html

修复:... DO UPDATE SET col1=EXCLUDED.col1;

x=> select * from tbla; 
id | col1 
----+------ 
    1 | 2 
    2 | 3 
(2 rows) 

x=> truncate tmp; 
TRUNCATE TABLE 
x=> insert into tmp(id,col1) values (1,42); 
INSERT 0 1 
x=> INSERT INTO tbla(id,col1) SELECT id,col1 FROM tmp ON CONFLICT (id) DO UPDATE SET col1=EXCLUDED.col1; 
INSERT 0 1 
sh161119=> select * from tbla; 
id | col1 
----+------ 
    2 | 3 
    1 | 42 
(2 rows) 
+0

这工作完美!下次我会尽力完整阅读和理解手册...... –