Как я могу обновить столбец между двумя уникальными значениями в другом столбце в MySQL? - PullRequest
0 голосов
/ 16 июня 2020

Как мне обновить столбец между двумя уникальными значениями в другом столбце в MySQL или MariaDB?

Рассмотрим таблицу с именем Example с тремя столбцами:

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

Я хотел бы обновить IsUpdated между двумя указанными c 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      |
* ----------------------------------------------------- *

Но поскольку идентификаторы не являются последовательными, этот метод не работает.

Каким будет наиболее эффективный способ обновления столбца (IsUpdated) между два уникальных значения в другом столбце (RandomId)?

1 Ответ

1 голос
/ 16 июня 2020

Вместо этого вам нужно отфильтровать по 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 в первой и последней строках (это также будет работать наоборот). Вы можете быть более конкретным c с двумя соединениями:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...