PostgreSQL 的 UPDATE 数据更新功能有哪些用法?

PostgreSQL UPDATE语句怎么玩?从改邮箱到批量更新的避坑技巧你都会吗? title: PostgreSQL UPDATE语句怎么玩?从改邮箱到批量更新的避坑技巧你都会吗?summary:PostgreSQL的UPDATE语句用于修改数据库中的已有数据,通过SET子句定义新值,WHERE子句精准定位行,FROM子句关联其他表,RETURNING子句返回修改结果。高级用法包括分批更新减少锁冲突、使用WITH子句分步处理复杂逻辑、结合游标逐行修改。实践案例展示了电商订单状态更新的具体实现,常见报错如语法错误、唯一约束冲突等也提供了解决方案。扫描。 阅读详情

PostgreSQL 的 UPDATE 语句用于修改表中已有数据,功能强大且灵活。以下是 全面详尽的 UPDATE 用法示例,涵盖基础到高级场景,均附带中文注释说明。


1. 基本更新:修改单条记录

-- 将 id 为 1 的用户邮箱更新为新地址
UPDATE users 
SET email = 'zhangsan_new@email.com' 
WHERE id = 1;

2. 更新多个字段

-- 同时更新用户的姓名、年龄和城市
UPDATE users 
SET name = '张三丰', age = 35, city = '西安'
WHERE id = 1;

3. 使用表达式更新字段

-- 年龄加 1(适用于生日更新)
UPDATE users 
SET age = age + 1 
WHERE id = 2;

-- 邮箱转为小写
UPDATE users 
SET email = LOWER(email) 
WHERE domain = 'COMPANY.COM';

4. 使用字符串拼接更新

-- 在用户名后添加后缀
UPDATE users 
SET name = name || '(已验证)' 
WHERE is_verified = TRUE;

5. 使用 DEFAULT 设置默认值

-- 将 profile 字段重置为默认值
UPDATE users 
SET profile = DEFAULT 
WHERE id = 5;

6. 使用函数更新数据

-- 更新最后登录时间为当前时间
UPDATE users 
SET last_login = NOW() 
WHERE id = 10;

-- 使用字符串函数截取或替换
UPDATE users 
SET email = REPLACE(email, 'old.com', 'new.com') 
WHERE email LIKE '%old.com';

7. 使用子查询更新字段

-- 将用户的 city 更新为其最近一次订单的发货城市
UPDATE users u
SET city = (
    SELECT o.ship_city 
    FROM orders o 
    WHERE o.user_id = u.id 
    ORDER BY o.order_date DESC 
    LIMIT 1
)
WHERE EXISTS (
    SELECT 1 FROM orders WHERE user_id = u.id
);

8. 多表关联更新(使用 FROM)

-- 根据 orders 表更新 users 表的 last_order_date
UPDATE users u
SET last_order_date = o.order_date,
    last_order_amount = o.amount
FROM orders o
WHERE u.id = o.user_id 
  AND o.order_date = (
      SELECT MAX(order_date) 
      FROM orders 
      WHERE user_id = u.id
  );

PostgreSQL 支持 UPDATE ... FROM 实现多表关联更新。


9. 使用 RETURNING 返回更新后的数据

-- 更新并返回用户的新信息(便于审计或调试)
UPDATE users 
SET age = 30, updated_at = NOW() 
WHERE id = 1 
RETURNING id, name, age, updated_at;

RETURNING 是 PostgreSQL 强大特性,避免额外查询。


10. 使用 CTE(公共表表达式)进行复杂更新

-- 先计算每个用户的平均订单金额,再更新 users 表
WITH avg_order AS (
    SELECT user_id, AVG(amount) AS avg_amt
    FROM orders 
    GROUP BY user_id
)
UPDATE users u
SET avg_order_amount = ao.avg_amt
FROM avg_order ao
WHERE u.id = ao.user_id;

11. 批量更新:根据条件批量修改

-- 将所有北京用户的城市改为“北京市”
UPDATE users 
SET city = '北京市' 
WHERE city = '北京';

-- 将未验证用户的 is_active 设置为 false
UPDATE users 
SET is_active = FALSE 
WHERE is_verified = FALSE;

12. 使用 CASE 表达式进行条件更新

-- 根据年龄段设置用户等级
UPDATE users 
SET level = CASE 
    WHEN age < 18 THEN '少年'
    WHEN age BETWEEN 18 AND 35 THEN '青年'
    WHEN age BETWEEN 36 AND 55 THEN '中年'
    ELSE '老年'
END;

13. 更新 JSON/JSONB 字段

-- 更新 profile 中的 phone 字段
UPDATE users 
SET profile = jsonb_set(profile, '{phone}', '"13800138000"')
WHERE id = 1;

-- 添加新的 JSON 字段
UPDATE users 
SET profile = profile || '{"vip": true, "level": 5}'::jsonb
WHERE id IN (1, 2, 3);

14. 更新数组字段

-- 向 hobbies 数组中添加新爱好
UPDATE users 
SET hobbies = array_append(hobbies, '摄影')
WHERE id = 1;

-- 删除数组中的某个元素
UPDATE users 
SET hobbies = array_remove(hobbies, '抽烟')
WHERE '抽烟' = ANY(hobbies);

15. 使用 LIMIT 限制更新数量(PostgreSQL 支持)

-- 仅更新最早注册的 5 个用户(谨慎使用!)
UPDATE users 
SET is_premium = TRUE 
WHERE is_premium = FALSE 
ORDER BY created_at ASC 
LIMIT 5;

⚠️ 注意:LIMIT 在 UPDATE 中存在,但可能影响可预测性,建议配合 ORDER BY 使用。


16. 使用 EXISTS 条件更新

-- 为有订单的用户设置 is_active = TRUE
UPDATE users u
SET is_active = TRUE
WHERE EXISTS (
    SELECT 1 FROM orders o WHERE o.user_id = u.id
);

17. 使用 IN 和子查询更新

-- 更新属于高价值客户组的用户标签
UPDATE users 
SET tags = tags || ARRAY['高价值']
WHERE id IN (
    SELECT user_id 
    FROM orders 
    GROUP BY user_id 
    HAVING SUM(amount) > 10000
);

18. 使用 LATERAL 进行高级更新

-- 为每个用户更新其最近订单的金额
UPDATE users u
SET last_order_amount = latest.amount
FROM LATERAL (
    SELECT amount 
    FROM orders 
    WHERE user_id = u.id 
    ORDER BY order_date DESC 
    LIMIT 1
) AS latest;

19. 使用触发器(Trigger)自动处理更新

-- 创建触发器:更新时自动设置 updated_at
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_set_updated_at
    BEFORE UPDATE ON users
    FOR EACH ROW EXECUTE FUNCTION set_updated_at();

20. 使用 RETURNING + CTE 记录更新日志

-- 更新用户并记录到审计表
WITH updated AS (
    UPDATE users 
    SET email = 'new@email.com', updated_at = NOW()
    WHERE id = 100
    RETURNING id, name, email, updated_at
)
INSERT INTO audit_log (table_name, record_id, action, details)
SELECT 'users', id, 'UPDATE', row_to_json(updated)::jsonb
FROM updated;

21. 条件更新:避免无意义更新

-- 只有当新值与旧值不同时才更新(减少日志和触发器触发)
UPDATE users 
SET last_login = '2025-04-05 10:00:00'
WHERE id = 1 
  AND last_login != '2025-04-05 10:00:00';

22. 使用序列(Sequence)更新字段

-- 为每个用户分配一个唯一的编号(如会员号)
UPDATE users 
SET member_no = nextval('member_seq')
WHERE member_no IS NULL;

23. 更新时使用窗口函数(间接方式)

-- 为每个城市的用户按年龄排序并分配排名
WITH ranked AS (
    SELECT id, 
           RANK() OVER (PARTITION BY city ORDER BY age DESC) AS age_rank
    FROM users
)
UPDATE users u
SET city_age_rank = r.age_rank
FROM ranked r
WHERE u.id = r.id;

24. 使用 COPY 或批量导入后更新(结合使用)

-- 先导入临时表,再更新主表
UPDATE users u
SET import_status = '成功', import_time = NOW()
FROM temp_import t
WHERE u.id = t.user_id;

总结:PostgreSQL UPDATE 核心功能

功能说明
SET column = value基础字段更新
WHERE 条件精确控制更新范围
FROM table多表关联更新
RETURNING返回更新后数据
ON CONFLICT不适用(仅 INSERT 支持)
CTE + UPDATE复杂逻辑更新
JSON/数组更新支持结构化数据
LIMIT限制更新行数(PostgreSQL 特有)

✅ 最佳实践建议

  1. 始终使用 WHERE 条件:避免误更新全表。
  2. 先 SELECT 验证条件:确保 WHERE 正确。
  3. 使用事务包装 UPDATE:便于出错回滚。
  4. 关键更新使用 RETURNING:获取结果更高效。
  5. 避免无条件更新:如 UPDATE users SET col = val。
  6. 批量更新优先使用 FROM 或 IN (SELECT):性能优于逐条更新。
  7. 使用触发器自动维护 updated_at:保证时间字段准确。

PostgreSQL 的 UPDATE 语句不仅支持基础修改,还提供 多表关联、RETURNING、CTE、JSON、数组、条件更新 等高级功能,是实现数据维护和业务逻辑的核心工具。合理使用可确保数据一致性与操作高效性。

深入探讨数据更新操作:UPDATE 语句的使用与最佳实践 title: 深入探讨数据更新操作:UPDATE 语句的使用与最佳实践author:excerpt:数据更新(UPDATE)是关系型数据库管理系统中的关键操作之一,它允许开发者和管理员修改已有数据,以满足业务需求和数据维护的需要。掌握 UPDATE 语句的正确使用不仅提高了数据管理的效率,还确保了数据的一致性和完整性。扫描数据更新(UPDATE)是关系型数据库管理系统中的关键操作之一,它允许开发者和管理员修改已有数据,以满足业务需求和数据维护的需要。 阅读详情

相关推荐

PostgreSQL 中如何实现数据的批量插入和更新?

在实际的数据库操作中,经常会遇到需要一次性处理大量数据的情况,就好像你要一口气搬很多箱水果入库一样,如果一个一个地搬,那可真是费时又费力。我们就采用了批量更新的方法,先把库存变化的数据整理到一个文件里,然后使用。还有,适当创建索引,但要注意别在插入数据的时候创建,不然就像在跑步的时候还背着重重的包袱,会拖慢速度。子句的条件是否正确,不然可能会把不该更新的数据也给改了,那可就“捅了大篓子”。在进行批量更新时,一定要小心谨慎,就像走钢丝一样,稍有不慎可能就会出问题。,里面每行都是一个学生的信息,用逗号分隔。

技术笔记 2783

PostgreSQL update/delete/upsert关联更新字段数据

PostgreSQL update/delete/upsert关联更新字段数据

chimchim66的博客 6364

PostgreSQL 中如何处理数据的批量更新和错误回滚的优化?

在 PostgreSQL 中,批量更新和错误回滚是两个非常重要的操作。通过优化批量更新操作,我们可以提高数据库的性能和效率,减少数据库的负担。通过优化错误回滚操作,我们可以保证数据的一致性和完整性,提高系统的可靠性。在实际应用中,我们需要根据具体情况选择合适的优化方法,并不断进行测试和调整,以达到最佳的优化效果。优化 PostgreSQL 中的批量更新和错误回滚操作就像是一场精心策划的战役,我们需要根据实际情况制定合理的战略和战术,才能在这场战役中取得胜利。

2401_86074221的博客 1395

postgresql update语句关联多个表

【代码】postgresql update语句关联多个表。

weixin_42279465的博客 1414

MySQL + PostgreSQL批量插入更新insertOrUpdate

???? 周周有福利,周周有惊喜 哪吒社区 - 风火轮计划 ???? Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强) ???? Java经典面试题大全:10万字208道Java经典面试题总结(附答案) ???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 这里写目录标题一、百度百科1、MySQL2、Pos

学Java,找哪吒 9683

【PostgreSQL教程】PostgreSQL UPDATE 语句

如果我们要更新在 PostgreSQL 数据库中的数据,我们可以用 UPDATE 来操作。

No8g攻城狮的博客 2043

Postgresql使用update

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

幺玲的博客 4780

电子取证之服务器取证思路

服务器取证是一个技术性很强的领域,涉及到多个环节,包括网站重构、网站代码分析、容器分析等。数据库密码的获取通常通过查看配置文件、日志文件、备份等途径,同时可以通过一些绕过技术如禁用身份验证来获取权限。对于不同的数据库,需要根据其特性采取相应的应对方法和命令。

2401_84830066的博客 2486

PostgreSQL update多张表关联查询更新

文章目录场景问题解决update后只能单张表set不能使用别名正确写法使用from验证最终SQL 场景 两张表,一张党员表,一张党组织表 党员表里冗余了一个党组织名称,但是党组织更新时,未更新党员表 现在需要使用SQL,将党员表里的冗余党组织名称修改正确 PostgreSQL的多表更新语法,与MySQL、Oracle不太一样 问题解决 为了防止更新出错,先把党员表复制一份,使用复制表执行更新SQL操作 无论是生产环境,还是测试环境,数据安全都是很重要的,无论是更新还是删除,一定要慎重,否则造成无法挽回

闫玉林的博客 1万+

告别算力焦虑:手把手教你用华为CloudMatrix384超节点部署MoE大模型(附xDeepServe配置)

本文详细解析了如何在华为CloudMatrix384超节点上高效部署MoE大模型,通过xDeepServe框架配置和专家分配优化,实现2300 Tokens/s的推理吞吐。文章涵盖环境准备、性能调优、成本平衡及容灾设计,帮助开发者告别算力焦虑,提升AI推理效率。

weixin_30790841的博客 439

告别配置迷茫:手把手教你用Vivado 2023.1配置Xilinx FPGA的DDR4 MIG IP核(含AXI接口详解)

本文详细介绍了如何在Vivado 2023.1中配置Xilinx FPGA的DDR4 MIG IP核,包括AXI接口的深度解析与优化。通过实战案例和调试技巧,帮助工程师快速掌握DDR4内存与FPGA的协同工作,提升系统性能。特别适合需要高性能计算和实时信号处理的开发者。

weixin_29231725的博客 437

pgsql 多表关联update数据(PostgreSQL)

场景:update 多表关联 表1与表2根据seriaild 列做关联 修改 set 表1.receive_ymd=表2.ymd  UPDAT SQL语句: UPDATE table_1 SET receive_ymd=inputymd FROM( SELECT * FROM table_1 AS ta_1 INNER JOI...

liq816的博客 2万+

怎样自己亲手搭建一个四比特加法器

如何用三极管搭建一个四比特加法器 一、前言 作为大一上学期第一个大作业,最终还是拖到了冬学期的第八周,从第七周的周六开始,一直到第八周周五上午课上展示,中间连续熬了好几天的夜,另外,白天凡是有时间都用在研究它了,最终大约是用了30个小时,完成了这个四比特加法器的“从零到一”。 最终,小组得分92,个人分数100(贡献比35%),也不枉自己投入的心血 二、器材 电阻 1 包(10kΩ×100,1kΩ×50) 三极管 1 包(9013×100,LED×6) 跳线 3 短 1.5 长 电源 1 个 USB 线

qq_34771124的博客 1万+

PostgreSQL UPDATE 语句详解

PostgreSQL 的UPDATE语句用于修改表中现有的记录,是数据库操作中最重要的"增删改查"四大操作之一。UPDATE 可以精确控制要修改的数据行和列,支持条件更新和多列更新。掌握基础语法和高级用法理解UPDATE操作的执行原理学会性能优化技巧注意事务和并发控制遵循安全最佳实践通过合理应用UPDATE语句,可以高效安全地完成各种数据修改需求,为应用系统提供可靠的数据维护能力。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1万+

NVMe-MI 协议解析:带外管理框架与实现原理

本文深入解析了NVMe-MI协议,这是一种用于NVMe固态硬盘的标准化带外管理接口。文章详细阐述了其独立于操作系统的管理框架,通过MCTP协议栈实现,支持SMBus/I2C、PCIe VDM和I3C等物理层,从而在系统故障时仍能可靠地进行健康监控、固件升级等关键运维操作,是现代数据中心存储管理的核心基础设施。

lll78的博客 957

从零到一:Mx_yolo本地训练与K210部署实战指南

本文详细介绍了从零开始进行Mx_yolo本地模型训练到K210部署的全流程实战指南。涵盖环境配置、数据准备、模型训练与调优、模型转换及K210部署等关键步骤,并提供了常见问题解决方案和性能优化技巧,帮助开发者高效完成AI模型在嵌入式设备的落地应用。

weixin_29081163的博客 251

postgresql 数据库 update 语句的初步使用

os: centos 7.4 db: postgresql 10.10 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) # # su - postgres Last login: Mon Feb 3 10:23:33 CST 2020 on pts/0 $ psql -c "select version();...

一名数据库爱好者的专栏 8343

Winform从入门到精通(38)——StatusStrip(史上最全)

本文介绍StatusStrip控件的详细用法,包含所有属性和事件,绝对史上最全!

qq_34059233的博客 2757

PostgreSQL11 | 插入、更新与删除数据

本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第7章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读。

红星编程实验室 1万+

EMC诊断技术及电磁兼容理论设计

本文深入探讨了EMC诊断技术,重点在于滤波篇,详细讲解了EMI滤波器的设计、选型、测试及应用注意事项。内容涵盖噪声限值法规、滤波器的法规依据、插入损耗测试以及滤波电容的高频特性。同时,还阐述了噪声源的近场与远场特性,如何快速定位和抑制噪声。通过实例分析,提供了滤波器件和辐射噪声抑制器件的选型策略。

让你爱上电路设计 2161

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SQL中update与update select结合语法详解与实例

本文主要介绍了通用的简单的update语句以及GreenPlum、MySQL、Oracle、SQLServer数据库的update与select相结合的用法以及实例。

至简的博客 20万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PostgreSQL 连表UPDATE

PostgreSQL 手册上的update语法如下: [ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ] SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) |

技术小站 3608

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

PostgreSQL UPDATE 语句

PostgreSQL UPDATE语句用于修改数据库表中的数据。基本语法为:UPDATE 表名 SET 列1=值1,列2=值2 WHERE 条件。通过WHERE子句可指定更新条件,如不指定则更新所有行。示例中演示了更新单个记录(将ID为3的salary改为15000)和批量更新(将所有记录的address改为Texas、salary改为20000)。执行后可通过查询验证数据是否成功更新。

nmxiaocui的博客 710

PostgreSQL UPDATE 命令

PostgreSQL 是一种功能强大的开源对象关系型数据库管理系统(ORDBMS),它使用并扩展了SQL语言。在处理数据库时,我们经常需要更新现有的记录。在PostgreSQL中,UPDATE命令用于修改表中的现有记录。

wjs2024的博客 2830
上一篇: PostgreSQL 常用 SELECT 数据查询命令
下一篇: PostgreSQL 的 DELETE 数据删除功能有哪些用法?
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值