MySQL INSERT INTO ON DUPLICATE KEY UPDATE с двумя полями

Моя таблица:

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

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

# sql-insert on-duplicate-key
Источник
Codelisting
за 0 против
Лучший ответ
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);

скрипка


what would you do if the values were strings? – Colin

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

  • 0
    Отличное решение, спасибо. Просто из любопытства ... что бы вы сделали, если бы значения были строками?
  • 0
    Нашел решение для этого. Я могу упорядочить значения в алфавитном порядке в PHP, прежде чем вставлять их в базу данных.
  • 1
    @Colin Обновлено.
Codelisting
Популярные категории
На заметку программисту