выражения в предложении ON UPDATE не может ссылаться на столбцы из SELECT.
Но они могут ссылаться на VALUES(amount)
, чтобы получить значение, которое вы пытались вставить в заданную строку.
INSERT INTO points_1_day (nick, amount)
(SELECT nick, SUM(amount) as increment
FROM points_log
WHERE dt >= NOW()-INTERVAL 1 day GROUP BY nick)
ON DUPLICATE KEY UPDATE
points_1_day.amount=points_1_day.amount+VALUES(amount);
Позвольте мне проверить это и посмотреть, если он работает ...
mysql> insert into points_1_day values (123, 10);
Query OK, 1 row affected (0.01 sec)
mysql> insert into points_log (nick, amount, dt) values (123, 15, NOW());
Query OK, 1 row affected (0.13 sec)
mysql> select * from points_1_day;
+------+--------+
| nick | amount |
+------+--------+
| 123 | 10 |
+------+--------+
1 row in set (0.00 sec)
mysql> INSERT INTO points_1_day (nick, amount) (SELECT nick, SUM(amount) as increment
FROM points_log WHERE dt >= NOW()-INTERVAL 1 day GROUP BY nick)
ON DUPLICATE KEY UPDATE points_1_day.amount=points_1_day.amount+values(amount);
Query OK, 2 rows affected (0.02 sec)
Records: 1 Duplicates: 1 Warnings: 0
mysql> select * from points_1_day;
+------+--------+
| nick | amount |
+------+--------+
| 123 | 25 |
+------+--------+
1 row in set (0.00 sec)
mysql> INSERT INTO points_1_day (nick, amount) (SELECT nick, SUM(amount) as increment
FROM points_log WHERE dt >= NOW()-INTERVAL 1 day GROUP BY nick)
ON DUPLICATE KEY UPDATE points_1_day.amount=points_1_day.amount+values(amount);
Query OK, 2 rows affected (0.00 sec)
Records: 1 Duplicates: 1 Warnings: 0
mysql> select * from points_1_day;
+------+--------+
| nick | amount |
+------+--------+
| 123 | 40 |
+------+--------+
Да, это похоже на работу.
Объяснение: http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html говорит:
Вы можете использовать функцию VALUES(col_name
) в пункте UPDATE
к относятся к значениям столбцов из INSERT
части INSERT ... ON DUPLICATE KEY UPDATE
заявления. Другими словами, VALUES(col_name)
в Предложение ON DUPLICATE KEY UPDATE
относится к значению col_name , которое будет вставлено, если конфликт дубликатов не возник. Эта функция особенно полезна в многострочных вставках. Функция VALUES()
имеет смысл только в операциях INSERT ... UPDATE
и возвращает NULL в противном случае. Пример:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
Это работает с INSERT...SELECT
тоже. Но аргумент VALUES()
- это имя столбца, которое вы вставляете, а не имя соответствующего столбца из SELECT
.
Это просто 'increment' - хотя это может быть не единственная проблема!?! – Strawberry
@Strawberry Если я использую приращение, я получаю ERROR 1054 (42S22): Неизвестный столбец «increment» в «списке полей». –