的ON UPDATE子句中的表达式不能指从选择列。
但它们可以引用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 ... ON DUPLICATE KEY UPDATE
语句的INSERT
部分列值。换句话说, VALUES(col_name)
in 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
中相应列的名称。
它只是“增量” - 虽然这可能不是唯一的问题!?! – Strawberry 2014-11-24 18:49:48
@Strawberry如果我使用增量,我得到ERROR 1054(42S22):未知列'增量'在'字段列表'中。 – 2014-11-24 18:51:02