【问题标题】:How can I update a column between two unique values in another column in MySQL?如何在 MySQL 的另一列中更新两个唯一值之间的列?
【发布时间】:2020-10-06 12:44:48
【问题描述】:

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

考虑一个名为Example 的表,它包含三列:

  1. Id: 自增整数 ID
  2. RandomId:一系列随机且唯一的 GUID
  3. IsUpdated:当前只包含 NULL 值的列,需要更新

* ----------------------------------------------------- *
| 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      |
* ----------------------------------------------------- *

我想在两个特定的 GUID 之间更新 IsUpdated,如下所示:

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 不是连续的,所以这种方法似乎不起作用。

在另一列 (RandomId) 中的两个唯一值之间更新一列 (IsUpdated) 的最有效方法是什么?

【问题讨论】:

  • “两个特定 GUID 之间的 GIUD”可能仅按字面定义。您不能从它们的值中提取任何其他排序信息(包括它们的生成排序)。当前定义中的任务是无法解决的。
  • 您是否有其他列对数据进行排序,例如日期或 auto_increment 列?
  • @Barmar 对于此示例,没有排序列,因为表的当前顺序始终是正确的顺序。您是否认为使用变量作为计数器可以模拟排序列(如下所示:stackoverflow.com/a/1895127/13190771)?
  • @rondoe MySQL 表没有任何“默认顺序”。
  • @Barmar 我同意,我认为自动增量 ID 是最有意义的,但是对于这个示例表,它不存在,并且可以安全地假设不会有任何自定义排序。插入行的顺序是本例中唯一应该考虑的“顺序”。

标签: mysql sql join sql-update mariadb


【解决方案1】:

您需要改为按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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多