联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话:15897897836 QQ:2106973531

PostgreSQL 的 INSERT ... ON CONFLICT DO UPDATE语法

INSERT ... ON CONFLICT DO UPDATE`是 PostgreSQL 提供的 "upsert"(插入或更新)功能,当插入记录与现有记录冲突时执行更新操作。

基本语法

sqlsql复制INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON CONFLICT (conflict_target) DO UPDATE 
SET column1 = value1, column2 = value2, ...;

参数说明

  1. conflict_target​ - 定义冲突检测的条件,可以是:

    • 主键或唯一约束的列名:(column_name)

    • 约束名称:ON CONSTRAINT constraint_name

    • WHERE 条件:(column_name) WHERE predicate

  2. DO UPDATE SET​ - 指定冲突时要更新的列和值

常见用法示例

1. 基于主键的 Upsert

INSERT INTO users (id, name, email)
VALUES (1,John Doe,john@example.com)
ON CONFLICT (id) DO UPDATE 
SET name = EXCLUDED.name, email = EXCLUDED.email;

2. 使用约束名称

INSERT INTO products (sku, name, price)
VALUES (ABC123,Widget, 9.99)
ON CONFLICT ON CONSTRAINT products_sku_key DO UPDATE 
SET name = EXCLUDED.name, price = EXCLUDED.price;

3. 部分更新(只更新特定字段)

INSERT INTO orders (order_id, customer_id, total)
VALUES (1001, 42, 199.99)
ON CONFLICT (order_id) DO UPDATE 
SET total = EXCLUDED.total;

4. 使用 EXCLUDED 伪表引用新值

INSERT INTO inventory (product_id, quantity)
VALUES (101, 5)
ON CONFLICT (product_id) DO UPDATE 
SET quantity = inventory.quantity + EXCLUDED.quantity;

5. 条件更新

INSERT INTO articles (id, title, views)
VALUES (123,New Article, 1)
ON CONFLICT (id) DO UPDATE 
SET views = articles.views + 1
WHERE articles.title = EXCLUDED.title;

特殊用法

6. 多列唯一约束

INSERT INTO user_devices (user_id, device_id, last_active)
VALUES (1,mobile, NOW())
ON CONFLICT (user_id, device_id) DO UPDATE 
SET last_active = EXCLUDED.last_active;

7. 什么都不做(类似 MySQL 的 INSERT IGNORE)

INSERT INTO table_name (id, data)
VALUES (1,test)
ON CONFLICT (id) DO NOTHING;

注意事项

  1. 必须指定冲突目标(主键、唯一约束或约束名称)

  2. EXCLUDED 伪表提供了被拒绝的插入行的值

  3. 性能通常优于先查询再决定插入或更新

  4. 在事务中使用时,整个操作是原子的

  5. PostgreSQL 9.5 及以上版本支持此语法

与 MySQL REPLACE 的区别

MySQL 的 REPLACE INTO 实际上是先删除冲突行再插入新行,而 PostgreSQL 的 ON CONFLICT DO UPDATE 是真正的更新操作,保留原有行的其他字段值。

相关文章

从安装PostgreSQL开始
通过以下步骤,你可以在 CentOS 7 上成功安装和配置 PostgreSQL 14。首先,设置 RPM 仓库并安装 PostgreSQL 14 服务器。然后,创建自定义数据存储目录并初始化数据库。接下来,修改启动脚本以使用自定义数据存储目录,并设置 PostgreSQL 监听所有 IP 地址。为了增强安全性,配置密码认证并修改 postgres 超级用户密码。最后,确保所有配置生效,重启 PostgreSQL 服务。通过这些步骤,你将拥有一个配置良好且安全的 PostgreSQL 数据库环境。如果在过程中遇到任何问题,请参考官方文档或寻求专业支持。
checkpoint是什么东西?一个位置?还是一个操作?
checkpoint是一个操作,执行这个操作的开始时刻,会记录当前开始时刻的 WAL 位置作为重做点,这个位置会被保存在文件中。 然后将该重做点之前所有 shared buffer 中的脏页均被刷入到存储。checkpoint又名检查点,一般checkpoint会将某个时间点之前的脏数据全部刷新到磁盘,以实现数据的一致性与完整性。
PostgreSQL 内参:深入解析运行原理【快照篇】
来源于灿哥的:《PostgreSQL 内参:深入解析运行原理》,非常好的一本书。
PG存在的级联删除(ON DELETE CASCADE)
在 PostgreSQL 中,如果你有两张表:用户表(users)和订单表(orders),并且用户表的主键是订单表的外键,那么你可以通过以下步骤来进行实验,删除订单表中的一条数据,然后删除用户表中的一条数据。

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册