2014-11-24 122 views
2

我试图从一个表增加一个值到另一个表,但是我找不出正确的语法。有人可以帮助我形成正确的声明吗?预先感谢您:INSERT INTO ... ON DUPLICATE KEY UPDATE增量语法

当前声明:

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

它只是“增量” - 虽然这可能不是唯一的问题!?! – Strawberry 2014-11-24 18:49:48

+0

@Strawberry如果我使用增量,我得到ERROR 1054(42S22):未知列'增量'在'字段列表'中。 – 2014-11-24 18:51:02

回答

3

的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中相应列的名称。

+0

嗯,我同意的诊断 - 我对治愈 – Strawberry 2014-11-24 18:52:59

+0

@比尔卡尔文怀疑 - 这确实按预期工作!你能解释你添加的VALUES语句吗?我正在尝试学习MySQL,我很好奇它为什么可以工作。 – 2014-11-24 18:56:36

相关问题