mysql - 更新行,如果更新失败则删除同一行

标签 mysql sql

我有一个汇总项目及其类别的表格。一个项目可以有多个类别。以下是简化的架构和示例数据:

表名称:外部引用,(itemID, catID) 定义为主键

itemID | catID
-------+-------
4059   | 159
4059   | 219

我还有一个类别合并功能。执行此操作时,我还将源类别中链接的产品移动到目标(合并)类别。为了将项目从类别 159 移动到类别 219,我使用如下 SQL:

UPDATE `xref` SET `catID` = 219 WHERE `catID` = 159

但是更新失败,因为已经存在 4059-219(PK 约束)。

期望的结果是

itemID | catID
-------+-------
4059   | 219

我无法在数据库上使用存储过程或函数,但可以在我的应用程序中实现所需的步骤。

  • 有没有办法在 UPDATE 查询失败时删除行?
  • 如何编写一个查询来“预测”将失败的 UPDATE 查询的行?类似于“返回同时具有 catID 219 和 159 的 itemID”。 SELECT * FROM xref WHERE catID IN (159, 219) GROUP BY itemID HAVING COUNT(*) >= 2 是正确的方法吗?

最佳答案

我无法使用@JNevill 的方法,因为我事先不知道受影响的 itemID。但这给了我这个两步解决方案的想法。

UPDATE IGNORE `xref` SET `catID` = 219 WHERE `catID` = 159
DELETE FROM `xref` WHERE `catID` = 159

感谢所有其他答案/评论。

关于mysql - 更新行,如果更新失败则删除同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47356760/

相关文章:

java - 替代 String.join 来连接

c# - 使用数据库中的数据实例化对象会更改值

MySql 合并查询

mysql - 按三个不同列中的最大值排序

SQL UNION 与 ORDER

sql - 从Polybase连接到hadoop时,连接被拒绝

mysql - 如何在MySql中使用group by查询非聚合列?

php - MySQL LIKE 关键字多列但查询哪列?

MySql Update 语句正在运行但未更新条目

mysql - 在聚合查询中计算具有特定条件的行