如何在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数据操作