mysql-使用“插入xxx选择”时满足复合主键

mysql-使用“插入xxx选择”时满足复合主键,mysql,Mysql,我正在将数据导入一个结构化的表: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,除非这会为当前用户标识/内容标识组合

我正在将数据导入一个结构化的表: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,除非这会为当前用户标识/内容标识组合创建一个重复的键,在这种情况下,我希望增加数字

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

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

非常感谢您的帮助。提前谢谢

-编辑

原则上这听起来可能真的很糟糕。但是,在输入随机数之后,我决定在更新中完成这项工作,我已经发送了随机数,以允许我继续目前的其他工作——这是一个纯粹的开发人员设置

-重新编辑

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
这就是我要做的,所以如果输入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)
;
这就是我要做的,所以如果输入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)
;

假设在旧的db表源中,您将没有相同的内容\u id、用户\u id组合,那么您可以使用此查询进行导入

insert newdbtable
select o.content_id, o.user_id, ifnull(max(n.`count`),-1)+1
from olddbtable o
left join newdbtable n on n.content_id=o.content_id and n.user_id=o.user_id
group by o.content_id, o.user_id;

假设在旧的db表源中,您将没有相同的内容\u id、用户\u id组合,那么您可以使用此查询进行导入

insert newdbtable
select o.content_id, o.user_id, ifnull(max(n.`count`),-1)+1
from olddbtable o
left join newdbtable n on n.content_id=o.content_id and n.user_id=o.user_id
group by o.content_id, o.user_id;

谢谢我只是在一个小样本的数据上尝试了这个方法,它似乎是在删除重复的数据,然后提供有多少个数据的计数,而不是保留它们并从零开始枚举。我不确定我的解释是否正确,但我希望所有的旧数据都能进入——我知道使用名为count的列是没有帮助的——我没有选择目标结构;你能给我一个小的数据样本吗?因为我认为目前还不清楚。当然可以。看原来的问题,我把它加上去了。这有用吗?很抱歉不清楚,谢谢您的关注!好极了非常感谢你这么做,我只是想不通。我想我也学到了一点,这总比粘贴解决方案好。谢谢你,汉克斯。我只是在一个小样本的数据上尝试了这个方法,它似乎是在删除重复的数据,然后提供有多少个数据的计数,而不是保留它们并从零开始枚举。我不确定我的解释是否正确,但我希望所有的旧数据都能进入——我知道使用名为count的列是没有帮助的——我没有选择目标结构;你能给我一个小的数据样本吗?因为我认为目前还不清楚。当然可以。看原来的问题,我把它加上去了。这有用吗?很抱歉不清楚,谢谢您的关注!好极了非常感谢你这么做,我只是想不通。我想我也学到了一点,这总比粘贴解决方案好。再次感谢你