Postgresql和MySQL中update语句中的set内的判断使用

本文介绍了一段SQL语句的具体含义,该语句用于更新work_order表中特定记录的order_num字段值,并根据mate_state字段值进行条件更新。
update work_order set order_num=100,mate_state = case when mate_state=2 then mate_state-1 else mate_state end where order_id='123';

这段语句的意思是work_order表中order_id为123的数据的order_num更新为100,mate_state等于2的减1,不等于2的保持不变。
注意: 后面的end一定要带

PostgreSQL 中,`INSERT INTO ... ON CONFLICT DO UPDATE SET` 是一种非常实用的功能,用于实现“UPSERT”操作,即在插入数据时,如果遇到唯一约束(如主键或唯一索引)冲突,则自动转为执行更新操作。这一功能自 PostgreSQL 9.5 版本引入[^2]。 ### 基本语法结构 ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON CONFLICT (conflict_column) DO UPDATE SET column1 = value1, column2 = value2, ...; ``` 其中,`conflict_column` 是唯一约束所在的列,通常是主键或具有唯一索引的列。 ### 使用场景 1. **数据同步**:在数据同步过程中,如果目标表中已存在某条记录,则更新其内容;否则插入新记录。 2. **数据更新**:在处理数据时,确保数据的最新状态被保存,避免重复插入导致的错误。 3. **批量处理**:在批量插入数据时,可以自动处理冲突,避免因部分数据冲突而导致整个操作失败。 ### 示例 假设有一个名为 `user_info` 的表,包含 `id` `name` 两个字段,其中 `id` 是主键。 ```sql INSERT INTO "user_info" ("id", "name") VALUES (1, '张三') ON CONFLICT ("id") DO UPDATE SET "name" = '张三'; ``` 在这个例子中,如果 `id` 为 1 的记录已经存在,则更新其 `name` 字段为“张三”;如果不存在,则插入新记录。 ### 注意事项 - **唯一约束**:必须在 `conflict_column` 上定义唯一约束或唯一索引,否则语句将无法正常工作。 - **性能考虑**:在处理大量数据时,使用 `ON CONFLICT` 可以提高性能,因为它避免了先查询后插入或更新的操作。 - **冲突处理**:在某些情况下,可能会遇到多条记录冲突的情况,需要确保 SQL 语句能够正确处理这些冲突[^4]。 ### 相关问题 1. 如何在 PostgreSQL 中创建唯一索引? 2. 在使用 `INSERT INTO ... ON CONFLICT` 时,如何处理多个冲突列? 3. PostgreSQL 的 `UPSERT` 操作与 MySQL 的 `REPLACE INTO` 有什么区别? 4. 如何在 PostgreSQL使用 `INSERT INTO ... ON CONFLICT` 进行批量插入更新? 5. 在使用 `INSERT INTO ... ON CONFLICT` 时,如何避免死锁?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值