如何在PostgreSQL数据库中实现upsert数据操作

  介绍

如何在PostgreSQL数据库中实现upsert数据操作?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1。介绍PostgreSQL upsert

在关系型数据库中,插入是一个组合词,即当往表中插入记录,如果该记录已存在则更新,否则插入新记录。为了使用该特性需要使用<代码> INSERT> INSERT  INTO  table_name (column_list),   值(value_list)   提醒CONFLICT  target 行动;

该语法中<代码> 目标可以是下面列举内容之一:

<李>

(column_name) -列名

<李>

约束constraint_name——唯一约束的名称

<李>

谓词——带谓词的,子句。

<代码> 可行动能为下面两者之一:

什么也不做——如果行已存在表中,不执行任何动作。
做更新设置column_1=value_1…条件——更新表中一些字段。

注意:<代码> 在冲突子句仅从PostgreSQL 9.5版本才有效。如果需用在之前版本,需要使用其他方法实现。

2。PostgreSQL upsert示例

下面语句创建客户表,演示PostgreSQL upsert特性:

DROP  TABLE  IF  EXISTS 顾客;      CREATE  TABLE  customers  (   customer_id  serial  PRIMARY 键,   name  VARCHAR 独一无二的,   email  VARCHAR  NOT 空,   active  bool  NOT  NULL  DEFAULT 真实的   );

客户表包括四个字段customer_id,姓名、电子邮件、活跃,名字字段有唯一约束确保名称唯一。

下面插入语句新增几条记录:

INSERT  INTO    ,customers (姓名,电子邮件)   VALUES    ,(& # 39;ibm # 39;,, & # 39; contact@ibm.com& # 39;),   ,(& # 39;微软# 39;,,& # 39;contact@microsoft.com& # 39;),   ,(& # 39;英特尔# 39;,,& # 39;contact@intel.com& # 39;);

假设现在微软修改邮件字段,从contact@microsoft.com到hotline@microft.com。我们可以使用更新更新语句,因为需要演示upsert特性,这里使用<代码> INSERT> INSERT  INTO  customers (姓名,电子邮件)   值(& # 39;微软# 39;& # 39;hotline@microsoft.com& # 39;),   提醒CONFLICT 提醒CONSTRAINT  customers_name_key    DO ;

上面语句表示如果名称表中存在,则什么都不做。下面语句与上面等价,但使用的名字列代替唯一约束名称:

INSERT  INTO  customers (姓名,电子邮件)   值(& # 39;微软# 39;& # 39;hotline@microsoft.com& # 39;),   提醒CONFLICT (名字),   DO ;

假设当记录已存在时你需要连接新的邮箱至原邮箱,这时更新动作:

INSERT  INTO  customers (姓名,电子邮件)   值(& # 39;微软# 39;& # 39;hotline@microsoft.com& # 39;),   提醒CONFLICT (名字),   DO    ,UPDATE  SET  email =, EXCLUDED.email  | |, & # 39;; & # 39;, | |, customers.email;

这里使用<强>排除虚拟表,其包含我们要更新的记录,也就是新记录(相对于原记录客户)。等式右边字段需要表名进行区分,才不会报字段不明确错误。
读者可以自行验证结果是否如你所愿。

关于如何在PostgreSQL数据库中实现upsert数据操作问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

如何在PostgreSQL数据库中实现upsert数据操作