gpt4 book ai didi

mysql - 使用 'insert into xxx select' 时满足复合主键

转载 作者:行者123 更新时间:2023-11-29 03:45:56 25 4
gpt4 key购买 nike

我正在将数据导入到结构化的表中:content_id|user_id|count - 所有整数都包含复合主键

我要从中选择它的表是结构化的:content_id|user_id

由于与我的用例相当具体的原因,我需要定期向其中发射大量数据,以需要一个纯 MySQL 解决方案

insert into new_db.table
select content_id,user_id,xxx from old_db.table

我希望每一行都将 xxx 设置为 0,除非这会创建一个重复的键,在这种情况下我希望增加当前 user_id/content_id 组合的数字

不是 MySQL 专家,我尝试了一些选项,例如尝试通过在插入期间从目标表中选择来填充 xxx,但没有成功。还尝试使用 ON DUPLICATE KEY 来增加计数器而不是通常的 UPDATE。但这一切似乎有点愚蠢,所以我想我会来这里!

有什么想法吗?我有一个用 PHP 包装它的备份选项,但它会大大增加脚本的整体运行时间,其中这将是唯一的非纯 MySQL 部分

非常感谢任何帮助。提前致谢!

--编辑

这在原则上听起来可能真的很糟糕。但 id 在输入随机数后选择了一种在更新中执行此操作的方法(我已发送随机数以允许我目前继续其他工作)——这是一个纯粹的开发设置

--重新编辑

12|234
51|45
51|45
51|45
23|67

理想情况下会插入

12|234|0
51|45|0
51|45|1
51|45|2
23|67|0

最佳答案

INSERT INTO new_db.table (content_id, user_id, cnt)
SELECT old.content_id, old.user_id, COUNT(old.*) - 1 FROM old_db.table old
GROUP BY old.content_id, old.user_id

这就是我要走的路,所以如果有 1 个条目,它会在 cnt 上放 0,如果更多,它只会放 1-2-3 等等。

编辑:

您的正确答案会有些复杂,但我测试了它并且有效:

INSERT INTO newtable(user_id,content_id,cnt) 
SELECT o1.user_id, o1.content_id,
CASE
WHEN COALESCE(@rownum, 0) = 0
THEN @rownum:=c-1
ELSE @rownum:=@rownum-1
END as cnt
FROM
(SELECT user_id, content_id, COUNT(*) as c FROM oldtable
GROUP BY user_id, content_id ) as grpd
LEFT JOIN
(SELECT oldtable.* FROM oldtable) o1 ON
(o1.user_id = grpd.user_id AND o1.content_id = grpd.content_id)
;

关于mysql - 使用 'insert into xxx select' 时满足复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5496775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com