postgresql - 更新冲突的新值

标签 postgresql

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

所以我得到了这些表

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;

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

最佳答案

不需要使用子选择。 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;

关于postgresql - 更新冲突的新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390655/

相关文章:

database - 在 postgresql 9.5 中安装 Orafce

ruby-on-rails - Rails db 数据在重新部署到 Heroku 时会丢失吗?

postgresql - 如何在 Laravel 中将数据类型从字符串更改为自动增量?

没有尾随零的 postgresql 数字类型

postgresql - psql:如何不将单个命令记录到历史记录中

php - 将数组绑定(bind)到 =ANY() 条件的 SQL 注入(inject)

ruby - Chef 独奏 : Installing build-essential recipe before postgresql

sql - PostgreSQL 中第一次出现空格时分割字符串?

postgresql - postgres 真空并没有改变臃肿

python 和 postgresql : reliably check for updates in a specific table