SQL按跨列匹配规则更新指定行并输出未更新异常ID
数据库更新需求实现步骤
首先约定本次操作涉及的表名为role_table,若你实际使用的表名不同,替换SQL语句中的对应表名即可。
1. 执行更新操作
仅ID在指定范围、且role2与ID=4的行相同的行会被更新,SQL语句如下:
-- 适配MySQL语法,其他数据库可去掉内层嵌套的临时表封装 UPDATE role_table SET role1 = 133 WHERE ID IN (1,2,3,5,6) AND role2 = (SELECT role2 FROM (SELECT role2 FROM role_table WHERE ID = 4) AS temp);
2. 查询更新成功的行
执行以下SQL即可得到预期的更新后结果:
SELECT ID, role1, role2, `Not` FROM role_table WHERE ID IN (1,2);
返回结果示例:
| ID | role1 | role2 | Not |
|---|---|---|---|
| 1 | 133 | AB | 0 |
| 2 | 133 | AB | 1 |
3. 输出无法更新的异常提示
执行以下SQL即可筛选出不符合更新规则的行,输出对应异常信息:
-- MySQL语法,其他数据库替换GROUP_CONCAT为对应字符串拼接聚合函数即可 SELECT GROUP_CONCAT(role1 SEPARATOR ', ') AS 无法更新的role1取值, '以上行因role2字段与ID为4的行不匹配,未执行更新' AS 异常原因 FROM role_table WHERE ID IN (1,2,3,5,6) AND role2 != (SELECT role2 FROM role_table WHERE ID = 4);
返回结果会展示789, 453, 764以及对应的异常说明,符合你的预期要求。
注意事项
- 字段名
Not属于SQL保留关键字,查询时需要根据你使用的数据库类型转义:MySQL用反引号`包裹,PostgreSQL/Oracle用双引号"包裹,SQL Server用方括号[]包裹 - 若需要保证数据安全,可在执行更新前开启事务,确认更新结果符合预期后再提交,避免误操作
内容的提问来源于stack exchange,提问作者Mufaddal
相关产品推荐
相关产品推荐

