首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -插入到…中使用从同一个表中选择的值更新重复键时

问MySQL -插入到…中使用从同一个表中选择的值更新重复键时
EN

Stack Overflow用户
提问于 2019-05-30 19:51:10
回答 1查看 130关注 0票数 0

我有两个表,一个是posts(ID, edited_date, is_public, ... etc),另一个是post_pagination(index, post_id),用于存储帖子的分页数据。在post_pagination中,index是主键。

在分页过程中,我需要检查排序的结果和post_pagination表,并执行插入/更新,如下所示:

代码语言:javascript
复制
INSERT INTO post_pagination(`index`, post_id)
SELECT * /* full outer join new sorted result and pagination table */
FROM (
    WITH 
    cte1 AS (
        SELECT ROW_NUMBER() OVER(ORDER BY edited_date DESC, ID DESC) AS new_rank, ID
        FROM posts
        WHERE is_public = 1
    ),
    cte2 AS (
        SELECT `index`
        FROM post_pagination
    )
    SELECT `index` AS dummy_rank, ID
    FROM cte2
    LEFT JOIN cte1 on `index` = new_rank
    UNION ALL
    SELECT new_rank AS dummy_rank, ID
    FROM cte2
    RIGHT JOIN cte1 on `index` = new_rank
    WHERE `index` IS NULL
) AS a
ORDER BY dummy_rank
ON DUPLICATE KEY UPDATE post_id = ID

第一次运行此查询时,post_pagination为空,因此MySQL将所有数据插入到表中。

代码语言:javascript
复制
index  post_id
1      390
2      391
3      392
4      393
5      307

它工作得很好。

当我第二次运行时,我希望所有数据都不会改变,但它会将所有post_id字段更新为结果的最后一个值。

代码语言:javascript
复制
index  post_id
1      307
2      307
3      307
4      307
5      307

我做了一些测试,似乎通过使用从同一个表中选择的值将值插入到一个表中会导致这个问题,但我不知道为什么

现在,我只需将查询的最后一行修改为:

代码语言:javascript
复制
ON DUPLICATE KEY UPDATE post_id = ID + 0

有没有更好的方法来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2020-04-01 12:02:43

您可以使用临时表吗?

代码语言:javascript
复制
CREATE TEMPORARY TABLE `post_pagination_temp` (
 `index` INTEGER(1) AUTO_INCREMENT PRIMARY KEY,
 `post_id` INTEGER(1)
);

INSERT INTO `post_pagination_temp` (`post_id`)
SELECT `ID` FROM `posts` ORDER BY `edited_date` DESC, `ID` DESC;

INSERT INTO `post_pagination`
SELECT * FROM `post_pagination_temp`
ON DUPLICATE KEY UPDATE `index` = VALUES(`index`);

这假设您在post_pagination上有正确的索引,即惟一的是post_id上的主键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56377783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档