java - 如果单行 SQL 中不满足条件,则回滚整个查询

标签 java sql hibernate sql-update

我必须对 USERPRODUCTS 表执行更新

PRODUCTID  USERNAME     PRODUCTCOUNTRY
 1          A            US
 2          A            UK
 3          B            US
 4          B            CA
 5          B            US
 6          C            IR
 7          F            IR
 8          A            IR

我有另一个表 PERSONCOUNTRY,我知道哪个人只能拥有哪个国家/地区的产品许可证,例如

PERSON         COUNTRYFORPRODUCTLICENSE 
A                    UK
B                    US
C                    IR

现在我想做的是编写一个查询来更新表 USERPRODUCTS 并将人员 A 设置为人员 B,这样只有当 B 对于人员 A 的 USERProductS 中的所有行都有 COUNTRYFORPRODUCTLICENSE 时,查询才应更新,否则不应更新任何行。

例如A 拥有上表中的 COUNTRYFORPRODUCTLICENSE、UK、US 和 IR,但 B 仅有 US 的 COUNTRYFORPRODUCTLICENSE。因此,更新查询应该更新第 1 行(因为 B 拥有美国国家/地区的许可证),但是当它到达第 2 行时,它应该全部回滚,即使是更新的第一行。

我知道这不能通过单一更新来处理

UPDATE USERPRODUCTS userproducts
SET USERNAME = 'B'
WHERE USERNAME = 'A'
AND EXISTS (SELECT * FROM PERSONCOUNTRY personcountry where    USERPRODUCTS.PRODUCTCOUNTRY IN (US))

此查询将仅更新 A 在 PRODUCTCOUNTRY 中包含 US 的位置,但不会回滚。

最快的方法是什么?我想在单个更新查询中完成此操作,但不能。我们可以使用 CURSOR 来做到这一点吗?但我必须在 Hibernate 代码中执行此操作

最佳答案

我仍然认为你可以用不存在来解决这个问题。从您的评论中,我感觉到您正在考虑基于行,但 sql 是基于集合工作的。当您执行 update 语句时,它不会更新行并移至下一行,而是更新符合 where 子句的所有行。

所以沿着这些思路:

    UPDATE USERPRODUCTS
    SET USERNAME = 'B'
    WHERE USERNAME = 'A'
    AND EXISTS (
                 SELECT   NULL 
                 FROM     PERSONCOUNTRY PC 
                 WHERE    PC.COUNTRYFORPRODUCTLICENSE IN ('US') 
                      AND PC.PERSON = USERPRODUCTS.USERNAME
               )
   AND NOT EXISTS (
                      SELECT   NULL 
                      FROM     PERSONCOUNTRY PC 
                      WHERE    PC.COUNTRYFORPRODUCTLICENSE NOT IN ('US') 
                           AND PC.PERSON = USERPRODUCTS.USERNAME
                  )

关于java - 如果单行 SQL 中不满足条件,则回滚整个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36301074/

相关文章:

javascript - 从 AngularJS 应用程序访问硬盘上的文件

java - 从另一个应用程序中获取信息

sql - 在 MS SQL Server 2005 中使用 RAND() 时我做错了什么?

spring - Hibernate - 未能延迟初始化角色集合 - 无法初始化代理 - 无 session

java - 如何在 Java Eclipse 中访问数据字段

java - 如何使用 Java 读取 BitBucket/Stash 分支及其链接的 JIRA 票据

sql - 在 Postgresql 中使用重复索引有什么坏处吗?

php - 使用 PHP 从数据库生成 HTML 表单

hibernate - 两个表中 hibernate 的主键

java - "org.hibernate.TransactionException: nested transactions not supported"但我没有嵌套事务