关于postgresql:Postgres Insert Into On冲突确实更新

Postgres Insert Into On conflict do update

我想使用on conflict do update-feature将数据从一个表("tmp")插入到另一个表("tbla")中。
我的代码:

1
2
3
4
5
6
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;

这段代码在"FROM tmp"中给了我一个语法错误
如果没有FROM,则表"错误":表"tmp"缺少FROM子句条目
关于我做错的任何建议?

DB-Server在带有postgres 9.5的Windows 7机器上的localhost上运行


文档"请注意,特殊排除表用于引用最初建议插入的值"https://www.postgresql.org/docs/9.5/static/sql-insert.html

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 -- wrap line
    ON CONFLICT (id) DO UPDATE SET col1=EXCLUDED.col1;

INSERT 0 1
sh161119=> SELECT * FROM tbla;
 id | col1
----+------
  2 |    3
  1 |   42
(2 ROWS)