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

时间:2011-03-31 07:55:01

标签: 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,除非这会创建一个重复的键,在这种情况下我希望增加当前user_id / content_id组合的数字

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

任何想法?我有一个备份选项,用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

2 个答案:

答案 0 :(得分: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个条目它将把0放在cnt上,更多它只会放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 :(得分:0)

假设在旧的db表(source)中,你将没有相同的(content_id,user_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;