mysql提供了这样的语法,即当我们往表里插数据里,如果数据已经存在(通过主键或唯一索引确定),我们可以对已存在的记录做更新操作。如:
INSERT USER(id,username) VALUES(1,'张三丰') ON DUPLICATE KEY UPDATE username='王老五'
上面的sql意思是,如果id为1的记录不存在,则insert一条id=1、username=张三丰的记录;否,将id为1记录的username改为王老五。这只是插入单行数据,mysql甚至支持批量操作,如:
INSERT INTO table (id,a,b,c) select id,a,b,c from xxx
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c)
即通过insert into ...from 来批量插入,然后通过values(xxx)来取得结果集中对应的字段值。
mysql这一强大的功能,让我们能够在一条sql里处理以前必须在存储过程里完成的操作。我们项目有个需求,定时统计文章的阅读数、收藏数、评论数,用一张表来保存统计数,我的sql如下:
INSERT INTO `composition_article_statistics` (
`article_id`,
`read_count`,
`concern_count`,
`paragraph_count`,
`discuss_count`
)
SELECT
id,
(SELECT
COUNT(1)
FROM
composition_user_read_log
WHERE ARTICLE_ID = ca.`id`) read_count,
(SELECT
COUNT(1)
FROM
composition_concren
WHERE `STATUS` = 1
AND ARTICLE_ID = ca.`id`) concern_count,
(SELECT
COUNT(1)
FROM
composition_article_paragraph
WHERE `status` = 1
AND article_id = ca.id) paragraph_count,
(SELECT
COUNT(1)
FROM
composition_common_discuss
WHERE TYPE = 2
AND STATUS = 1
AND target_id = ca.id) discuss_count
FROM
composition_article ca
ON DUPLICATE KEY
UPDATE
`read_count` =
VALUES
(read_count),
`concern_count` =
VALUES
(concern_count),
`paragraph_count` =
VALUES
(paragraph_count),
`discuss_count` =
VALUES
(`discuss_count`)
不管是旧文章还是新文章都能统计到,完美解决了我的问题。