如何在mysql中的另一列中的两个唯一值之间更新列?

rks48beu  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(328)

如何在mysql或mariadb中的另一列中的两个唯一值之间更新列?

考虑一个名为 Example 有三列: Id :自动递增整数id RandomId :一系列随机且唯一的guid IsUpdated :当前只包含空值的列,需要更新


* ----------------------------------------------------- *

| Id | RandomId                             | IsUpdated |
| ----------------------------------------------------- |
| 1  | c446980b-cf2f-4f2d-a27b-28d6bde6415d | NULL      |
| 2  | d6a1a52c-d073-4019-836a-67cf6551d958 | NULL      |
| 3  | 7a339a6a-8e57-4373-84fd-1b40ee51c884 | NULL      |
| 4  | 56b908a7-fb07-4f4c-a25d-699cf40cf690 | NULL      |
| 5  | fac75ce6-a605-453a-958c-74f197e20a11 | NULL      |

* ----------------------------------------------------- *

我想更新 IsUpdated 在两个特定的guid之间,例如:

UPDATE Example
   SET IsUpdated = 1
 WHERE RandomId >= 'd6a1a52c-d073-4019-836a-67cf6551d958' -- Starting Here
   AND RandomId <= '56b908a7-fb07-4f4c-a25d-699cf40cf690' -- Ending Here

生成的表应如下所示:


* ----------------------------------------------------- *

| Id | RandomId                             | IsUpdated |
| ----------------------------------------------------- |
| 1  | c446980b-cf2f-4f2d-a27b-28d6bde6415d | NULL      |
| 2  | d6a1a52c-d073-4019-836a-67cf6551d958 | 1         |
| 3  | 7a339a6a-8e57-4373-84fd-1b40ee51c884 | 1         |
| 4  | 56b908a7-fb07-4f4c-a25d-699cf40cf690 | 1         |
| 5  | fac75ce6-a605-453a-958c-74f197e20a11 | NULL      |

* ----------------------------------------------------- *

但是由于id不是连续的,所以这种方法似乎不起作用。
更新列的最有效方法是什么( IsUpdated )在另一列中的两个唯一值之间( RandomId )?

4c8rllxm

4c8rllxm1#

你需要过滤 id 相反。我推荐 update ... join 语法:

update example e
inner join (
    select min(Id) minId, max(Id) maxId
    from example
    where RandomId in (
        'd6a1a52c-d073-4019-836a-67cf6551d958', 
        '56b908a7-fb07-4f4c-a25d-699cf40cf690'
    )
) i on e.id between i.minId and i.maxId
set e.IsUpdated = 1

请注意,这并不能严格保证guid在第一行和最后一行上是匹配的(也可以反过来)。您可以更具体地使用两个联接:

update example e
inner join (
    select Id
    from example
    where RandomId = 'd6a1a52c-d073-4019-836a-67cf6551d958'
) eMin on e.id >= eMin.id
inner join (
    select Id
    from example
    where RandomId = '56b908a7-fb07-4f4c-a25d-699cf40cf690'
) eMax on e.id <= eMax.id
set e.IsUpdated = 1

相关问题