2014-11-24 5 views
2

Я пытаюсь увеличить значение из одной таблицы в другую, но я не могу понять правильный синтаксис. Может ли кто-нибудь помочь мне составить правильное заявление? Спасибо заранее:INSERT INTO ... ON DUPLICATE KEY UPDATE Increment Syntax

Текущее заявление:

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+points_log.increment; 

Я получаю сообщение об ошибке:

ERROR 1054 (42S22): Unknown column 'points_log.increment' in 'field list' 
+0

Это просто 'increment' - хотя это может быть не единственная проблема!?! – Strawberry

+0

@Strawberry Если я использую приращение, я получаю ERROR 1054 (42S22): Неизвестный столбец «increment» в «списке полей». –

ответ

3

выражения в предложении 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.

+0

Хм, я согласен с диагнозом - я подозрительно отношусь к лекарству – Strawberry

+0

@ Билл-Карвин - Это работает так, как ожидалось! Можете ли вы объяснить заявление VALUES, которое вы добавили? Я пытаюсь изучить MySQL, и мне интересно, почему это работает. –

Смежные вопросы