总结放页顶,前途必似锦:整个语句,可拆分成两段来看,唯一索引没有重复时,看前半段,就一个insert语句。
如果唯一索引重复,则执行更新,更新时,看ON DUPLICATE KEY UPDATE 后面的处理。有处理的才更新,没处理的不更新,
其中处理时,用values括号括起来的,就是取前values里面的值,没有被括起来的,就是取数据库该字段更新前的值。
先看一下数据库里面要操作的表,其中user_id是主键。
SQL语句执行前,数据库状态如下。
SQL语句如下。
INSERT INTO community_user_statistic ( user_id, fans_count, interest_count, likes_count, stories_count, moment_count, marks_count )
VALUES( 2, 2, 3, 4, 5, 6, 7 )
ON DUPLICATE KEY UPDATE stories_count = stories_count + 10,
fans_count = VALUES( fans_count ) + 10,
interest_count = VALUES( interest_count ),
marks_count = marks_count
那我们就执行上图的SQL语句。
上图可知只影响了一行数据。我们再看结果。
已经正常插入了,值也和我们VALUES里面设置的一样。但是ON DUPLICATE KEY UPDATE后面那一块儿的处理没有任何作用,这是因为ON DUPLICATE KEY UPDATE这个语句的意思呢,就是SQL语句中涉及到的唯一索引,数据库里面有就执行更新,没有就执行插入。
为了方便看一下语句的更新功能,我们修改一下SQL,就是主键ID不变的情况下,VALUES里面的值都增加10,
ps:ON DUPLICATE KEY UPDATE后面的语句没有改动,和第一次执行时一样的。
可以自己先想想看更新后各个字段的值是怎样的。
INSERT INTO community_user_statistic ( user_id, fans_count, interest_count, likes_count, stories_count, moment_count, marks_count )
VALUES( 2, 12, 13, 14, 15, 16, 17 )
ON DUPLICATE KEY UPDATE
fans_count =VALUES( fans_count )+ 10,
interest_count =VALUES( interest_count ),
stories_count = stories_count + 10,
marks_count = marks_count
执行一下看看结果。
影响了两行,说明更新成功了。再看看结果,各个字段的值和你预想的一样吗?
我们一个一个分析。我们把INSERT INTO 后面附属的VALUES称为前VALUES。ON DUPLICATE KEY UPDATE后的VALUES称为后VALUES。
user_id:我们没有做处理,所以没变。
fans_count:前VALUES里面设置的是12,
ON DUPLICATE KEY UPDATE后面的处理是 fans_count =VALUES( fans_count )+ 10, 所以是12+10=22。
interest_count:前VALUES里面设置的是13,
ON DUPLICATE KEY UPDATE后面的处理是 interest_count =VALUES( interest_count ).所以值为13。
likes_count:ON DUPLICATE KEY UPDATE后面没处理,依然保持原值4。
stories_count(和fans_count对比着看):前VALUES里面设置的是15,
ON DUPLICATE KEY UPDATE后面的处理是 stories_count = stories_count + 10, 没有用VALUES括号括起来的,就是数据库原来的值。所以 5+10=15。
moment_count:和stories_count同理,所以是6。