MySQL INSERT INTO ON DUPLICATE KEY UPDATE с двумя полями - PullRequest
0 голосов
/ 20 апреля 2020

Моя таблица:

----------------------------
| valueA | valueB | valueC |
----------------------------
|  ...   |  ...   |  ...   |
|  ...   |  ...   |  ...   |
  • Первичный ключ (значение A, значение B)
  • Я хочу вставить значения или обновить значение C если запись уже существует

Мой код:

INSERT INTO myTable (valueA, valueB, valueC) VALUES
(1, 2, 1), 
(1, 2, 2),
(2, 1, 3), 
(3, 4, 4)
on duplicate key update valueC = 5;

Результат этого утверждения:

----------------------------
| valueA | valueB | valueC |
----------------------------
|   1    |   2    |   5    |
|   2    |   1    |   3    |
|   3    |   4    |   4    |

Я не просто хочу обновить, если новое значение A = старое значение A и новое значение B = старое значение B, но также, если новое значение A = старое значение B и новое значение B = старое значение A.

В моем Пример таблицы (1, 2, 1), (1, 2, 2) и (2, 1, 3) будет дубликатом. Не только (1, 2, 1) и (1, 2, 2).

Вот как это должно выглядеть:

----------------------------
| valueA | valueB | valueC |
----------------------------
|   1    |   2    |   5    |
|   3    |   4    |   4    |

Как я могу сделать это с как можно меньшим количеством утверждений? Заранее спасибо.

1 Ответ

1 голос
/ 20 апреля 2020
ALTER TABLE myTable
    ADD COLUMN least_value INT AS ((LEAST(valueA, valueB))),
    ADD COLUMN greatest_value INT AS ((GREATEST(valueA, valueB))),
    ADD UNIQUE INDEX idx (least_value, greatest_value);

скрипка


что бы вы сделали, если бы значения были строками? - Colin

LEAST / GREATEST правильно обрабатывает строковые значения. скрипка . Единственное - тип данных для вычисляемого столбца должен быть в состоянии принять значение.

...