在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文介绍如何使用PostgreSQL upsert特性插入或当被插入数据已存在则更新数据。 1. 介绍PostgreSQL upsert 在关系型数据库中,upsert是一个组合词,即当往表中插入记录,如果该记录已存在则更新,否则插入新记录。为了使用该特性需要使用 INSERT INTO table_name(column_list) VALUES(value_list) ON CONFLICT target action; 该语法中
DO NOTHING – 如果行已存在表中,不执行任何动作.
2. PostgreSQL upsert示例 下面语句创建customers表,演示PostgreSQL upsert特性: DROP TABLE IF EXISTS customers; CREATE TABLE customers ( customer_id serial PRIMARY KEY, name VARCHAR UNIQUE, email VARCHAR NOT NULL, active bool NOT NULL DEFAULT TRUE ); customers 表包括四个字段customer_id, name, email, active,name字段有唯一约束确保名称唯一。 下面插入语句新增几条记录: INSERT INTO customers (name, email) VALUES ('IBM', '[email protected]'), ('Microsoft', '[email protected]'), ('Intel', '[email protected]'); 假设现在Microsoft 修改email字段,从 [email protected] 到 [email protected]。我们可以使用update更新语句,因为需要演示upsert特性,这里使用 INSERT INTO customers (NAME, email) VALUES('Microsoft','[email protected]') ON CONFLICT ON CONSTRAINT customers_name_key DO NOTHING; 上面语句表示如果名称表中存在,则什么都不做。下面语句与上面等价,但使用name列代替唯一约束名称: INSERT INTO customers (name, email) VALUES('Microsoft','[email protected]') ON CONFLICT (name) DO NOTHING; 假设当记录已存在时你需要连接新的邮箱至原邮箱,这时update动作: INSERT INTO customers (name, email) VALUES('Microsoft','[email protected]') ON CONFLICT (name) DO UPDATE SET email = EXCLUDED.email || ';' || customers.email; 这里使用EXCLUDED虚拟表,其包含我们要更新的记录,也就是新记录(相对于原记录customers)。等式右边字段需要表名进行区分,才不会报字段不明确错误。 3. 总结 本文介绍通过 到此这篇关于PostgreSQL upsert(插入更新)教程详解的文章就介绍到这了,更多相关PostgreSQL upsert内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论