Ответ 1
INSERT INTO tb (name, date, stat1, stat2, stat3)
VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE stat1 = stat1 + VALUES(stat1), stat2 = stat2 + VALUES(stat2), stat3 = stat3 + VALUES(stat3)
У меня есть таблица (name, date, stat1, stat2, stat3)
, (name, date)
- это PK. Когда я вставляю строки, будут дубликаты ключей, и мне нужно суммировать три статистики. Я использую следующий запрос с PreparedStatement в Java:
INSERT INTO tb (name, date, stat1, stat2, stat3)
VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE stat1 = stat1 + ?, stat2 = stat2 + ?, stat3 = stat3 + ?
Есть ли более сжатый запрос для достижения этого? Поскольку я упростил запрос, там более десяти характеристик.
INSERT INTO tb (name, date, stat1, stat2, stat3)
VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE stat1 = stat1 + VALUES(stat1), stat2 = stat2 + VALUES(stat2), stat3 = stat3 + VALUES(stat3)
Добавьте вычисленный столбец (сумма) и включите его в свой ПК.
Однако это делает денормализацию вашей таблицы. Вы можете использовать суррогатный ключ и выполнить расчет в своем SELECT
Если вы укажете ON DUPLICATE KEY UPDATE, и будет вставлена строка, которая приведет к дублированию значения в индексе UNIQUE или PRIMARY KEY, MySQL выполнит ОБНОВЛЕНИЕ старой строки. Например, если столбец a объявлен как UNIQUE и содержит значение 1, следующие два оператора имеют схожий эффект:
INSERT INTO таблица (a, b, c) ЗНАЧЕНИЯ (1,2,3) ON DUPLICATE KEY UPDATE c = c + 1;
Пример эквивалентного обновления, как показано ниже,
Таблица UPDATE SET c = c + 1 WHERE a = 1;
Если столбец a и b уникален, эквивалентный запрос на обновление будет,
Таблица UPDATE SET c = c + 1 WHERE a = 1 ИЛИ b = 2 LIMIT 1;