使用一个查询更新两个表

时间:2017-11-16 18:54:05

标签: mysql sql-update

我有两张桌子,Dtable d和Rtable r。我想按以下顺序用一个查询(重要!)更新两个表:首先使用Rtable中的值设置所有Dtable匹配行值。然后 - 从Rtable更改值。在Rtable中,将始终存在与键匹配的记录,但在Dtable中,可以有0,1或许多与键匹配的记录。我想出了以下选择:

UPDATE Dtable d, Rtable r

SET
    d.value = r.value,
    r.value = 0
WHERE
    d.key = 403 AND d.value = 0 AND r.id = 403 

但问题是,如果我在Dtable中有多个匹配键的记录,只有第一个记录从Rtable更新值,然后Rtable的值发生变化,Dtable的第二行已经从更改后的值更新Rtable,这不是我想要的。

以下是更新前两个表的内容示例:

Dtable             Rtable
---------------    --------------- 
| key | value |    | key | value |
---------------    ---------------
| 403 |   0   |    | 403 |   105 |
---------------    ---------------
| 403 |   0   |
---------------

这就是我希望它在更新后的目的:

Dtable             Rtable
---------------    --------------- 
| key | value |    | key | value |
---------------    ---------------
| 403 |  105  |    | 403 |   0   |
---------------    ---------------
| 403 |  105  |
---------------

有什么建议吗?感谢

2 个答案:

答案 0 :(得分:0)

看看这是否让你更接近:

UPDATE Dtable s, Rtable r
SET s.value = r.value,
r.value = 0
FROM Rtable r
JOIN Dtable d
ON r.key = d.key
WHERE d.key = 403;

答案 1 :(得分:0)

试试这个 -

public class UserService extends HystrixCommand<Boolean> {
     private final User user;

     public User getUserById(String id) {
        super(HystrixCommandGroupKey.Factory.asKey("AnyUser"));
        user = storage.get(id);
        return user;
    }

    public void update(User user) { // SET
        super(HystrixCommandGroupKey.Factory.asKey("AnyUser"));
        this.user = user;
        storage.put(user.getId(), user);
    }

    @Override
    protected Boolean run() {
        return user == null || (user != null && user.id == 0);
    }

    @Override
    protected String getCacheKey() {            
        return (user != null ) ?String.valueOf(user.id):"";
    }
}