• 售前

  • 售后

热门帖子
入门百科

PostgreSQL upsert(插入更新)数据的操作详解

[复制链接]
我本迷茫 显示全部楼层 发表于 2021-10-26 13:40:50 |阅读模式 打印 上一主题 下一主题
本文先容如何利用PostgreSQL upsert特性插入或当被插入数据已存在则更新数据。
1. 先容PostgreSQL upsert
在关系型数据库中,upsert是一个组合词,即当往表中插入纪录,假如该纪录已存在则更新,否则插入新纪录。为了利用该特性必要利用
  1. INSERT ON CONFLICT
复制代码
语句:
  1. INSERT INTO table_name(column_list)
  2. VALUES(value_list)
  3. ON CONFLICT target action;
复制代码
该语法中
  1. target
复制代码
可以是下面枚举内容之一:
      
  • (column_name) – 列名  
  • ON CONSTRAINT constraint_name – 唯一束缚的名称  
  • WHERE predicate – 带谓词的where子句.
  1. action
复制代码
大概为下面两者之一:
DO NOTHING – 假如行已存在表中,不实行任何动作.
DO UPDATE SET column_1 = value_1, … WHERE condition – 更新表中一些字段.
  1. 注意:[code]ON CONFLICT
复制代码
子句仅从PostgreSQL 9.5版本才有效。假如需用在之前版本,必要利用其他方法实现。[/code]2. PostgreSQL upsert示例
下面语句创建customers表,演示PostgreSQL upsert特性:
  1. DROP TABLE IF EXISTS customers;
  2. CREATE TABLE customers (
  3.         customer_id serial PRIMARY KEY,
  4.         name VARCHAR UNIQUE,
  5.         email VARCHAR NOT NULL,
  6.         active bool NOT NULL DEFAULT TRUE
  7. );
复制代码
customers 表包罗四个字段customer_id, name, email, active,name字段有唯一束缚确保名称唯一。
下面插入语句新增几条纪录:
  1. INSERT INTO
  2. customers (name, email)
  3. VALUES
  4. ('IBM', 'contact@ibm.com'),
  5. ('Microsoft', 'contact@microsoft.com'),
  6. ('Intel', 'contact@intel.com');
复制代码
假设如今Microsoft 修改email字段,从 contact@microsoft.com 到 hotline@microft.com。我们可以利用update更新语句,由于必要演示upsert特性,这里利用
  1. INSERT ON CONFLICT
复制代码
语句:
  1. INSERT INTO customers (NAME, email)
  2. VALUES('Microsoft','hotline@microsoft.com')
  3. ON CONFLICT ON CONSTRAINT customers_name_key
  4. DO NOTHING;
复制代码
上面语句表现假如名称表中存在,则什么都不做。下面语句与上面等价,但利用name列代替唯一束缚名称:
  1. INSERT INTO customers (name, email)
  2. VALUES('Microsoft','hotline@microsoft.com')
  3. ON CONFLICT (name)
  4. DO NOTHING;
复制代码
假设当纪录已存在时你必要毗连新的邮箱至原邮箱,这时update动作:
  1. INSERT INTO customers (name, email)
  2. VALUES('Microsoft','hotline@microsoft.com')
  3. ON CONFLICT (name)
  4. DO
  5. UPDATE SET email = EXCLUDED.email || ';' || customers.email;
复制代码
这里利用EXCLUDED虚拟表,其包罗我们要更新的纪录,也就是新纪录(相对于原纪录customers)。等式右边字段必要表名举行区分,才不会报字段不明白错误。
读者可以自行验证结果是否如你所愿。
3. 总结
本文先容通过
  1. INSERT ON CONFLICT
复制代码
实现PostgreSQL插入更新特性。
到此这篇关于PostgreSQL upsert(插入更新)教程详解的文章就先容到这了,更多干系PostgreSQL upsert内容请搜索草根技术分享以前的文章或继续欣赏下面的干系文章希望大家以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作