更新冲突的新价值

时间:2016-11-02 22:09:05

标签: postgresql

我想用insert语句更新一行。实际上,我可以插入行,但如果已存在唯一属性,我想更新内容。

所以我得到了这些表

CREATE TABLE dtest (
  "id" text,
  followers_count int4,
  someuniq int4
);
CREATE UNIQUE INDEX dtest_idx ON dtest USING btree (someuniq);

CREATE TABLE temp_data (
  tid text,
  tfo int4,
  tuniq int4);

我们考虑一下,我有一个临时标签,我从这个表中插入/更新数据

INSERT INTO temp_data VALUES ('id1',4,1);
INSERT INTO temp_data VALUES ('id2',0,2);
INSERT INTO temp_data VALUES ('id3',40,3);


INSERT INTO dtest("id","followers_count","someuniq")
SELECT  t.tid, t.tfo, t.tuniq
FROM    temp_data t
ON CONFLICT DO NOTHING;

我想知道是否可以使用类似的内容更新值,而不是进行插入然后更新。

INSERT INTO dtest("id","followers_count","someuniq")
SELECT  tid, tfo, tuniq
FROM    temp_data 
ON CONFLICT ("someuniq")
DO UPDATE SET followers_count = 
        (SELECT tfo FROM temp_data where tid = EXCLUDED.tid)
    WHERE EXCLUDED.id = tid;

这意味着,"如果该行已经存在,请更新一些字段",我做错了什么?

1 个答案:

答案 0 :(得分:1)

无需使用子选择。 excluded行将包含所有目标列,包括followers_count

INSERT INTO dtest (id, followers_count, someuniq)
SELECT  tid, tfo, tuniq
FROM temp_data 
ON CONFLICT (someuniq)
DO UPDATE 
    SET followers_count = excluded.followers_count;