加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL INSERT ON CONFLICT UPDATE(upsert)使用所有排除的值

发布时间:2020-12-13 16:35:56 所属栏目:百科 来源:网络整理
导读:当您插入一行(PostgreSQL 9.5),并且您希望可能的INSERT与可能的UPDATE完全相同时,可以这样写: INSERT INTO tablename (id,username,password,level,email) VALUES (1,'John','qwerty',5,'john@mail.com') ON CONFLICT (id) DO UPDATE SET id=EXCLUDED.id,
当您插入一行(PostgreSQL> 9.5),并且您希望可能的INSERT与可能的UPDATE完全相同时,可以这样写:
INSERT INTO tablename (id,username,password,level,email) 
                VALUES (1,'John','qwerty',5,'john@mail.com') 
ON CONFLICT (id) DO UPDATE SET 
  id=EXCLUDED.id,username=EXCLUDED.username,password=EXCLUDED.password,level=EXCLUDED.level,email=EXCLUDED.email

有更短的路吗?要说:使用所有的EXCLUDE值。

在SQLite中我曾经做过:

INSERT OR REPLACE INTO tablename (id,user,email) 
                        VALUES (1,'john@mail.com')
Postgres没有实现等同于INSERT或REPLACE。从 ON CONFLICT docs(强调我的):

It can be either DO NOTHING,or a DO UPDATE clause specifying the exact details of the UPDATE action to be performed in case of a conflict.

虽然它并没有给你更换的速记,但ON CONFLICT DO UPDATE更为普遍,因为它允许您根据预先存在的数据设置新的值。例如:

INSERT INTO users (id,level)
VALUES (1,0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读