我有一个表t1
,有些行在所有列中都有重复,除了id
。
t1
的{{1}}是AUTO_INCREMENT,并且有1MIL行。
id
是一个没有数据的新表,t2
不需要AUTO_INCREMENT,因为我可能会为此创建一个新列。
问:我创建id
后,如何将t2
复制到t1
,其中所有列中的t2
都有不同的值,以便t1
没有重复的行
我在亚马逊t2
RDS
t1 - 这就是我所拥有的
ENGINE=InnoDB
t2 - 这就是我想要的结果
+---+-----+-----+------+-------+
|id |fname|lname|mytext|morevar|
|---|-----|-----|------|-------|
| 1 | joe | min | abc | 123 |
| 2 | joe | min | abc | 123 |
| 3 | mar | kam | def | 789 |
| 4 | kel | smi | ghi | 456 |
+------------------------------+
这是我的尝试,但得到了:+---+-----+-----+------+-------+
|id |fname|lname|mytext|morevar|
|---|-----|-----|------|-------|
| 1 | joe | min | abc | 123 |
| 3 | mar | kam | def | 789 |
| 4 | kel | smi | ghi | 456 |
+------------------------------+
Error Code: 1136. Column count doesn't match value count at row 1
答案 0 :(得分:2)
最简单的方法是使用group by
:
INSERT INTO t2 (id,fname,lname,mytext,morevar)
SELECT id,fname,lname,mytext,morevar
FROM t1 st
WHERE st.id>0 AND st.id<=1000
group by mytext;
但是,从技术上讲,这是不正确的,因为不保证列值来自同一行。所以,正确的方法是:
INSERT INTO t2 (id,fname,lname,mytext,morevar)
SELECT st.id, st.fname, st.lname, st.mytext, st.morevar
FROM t1 st join
(select mytext, min(id) as minid
from t1
group by mytext
) mint
on st.id = minid
WHERE st.id>0 AND st.id<=1000 ;
答案 1 :(得分:1)
使用GROUP BY
使该列不同。
INSERT INTO t2 (id,fname,lname,mytext,morevar)
SELECT id, fname, lname, mytext, morevar
FROM t1 st
WHERE st.id>0
AND st.id<=1000
GROUP BY mytext
如果重复项之间的其他列不同,它将任意选择它们的值(不一定是来自相同的行)。
答案 2 :(得分:1)
尝试此代码,它将选择最小的重复ID数,并考虑所有列。
INSERT INTO t2 (id,fname,lname,mytext,morevar)
SELECT min(id) id, fname, lname, mytext, morevar
FROM t1
WHERE t1.id > 0 and t1.id <= 1000
GROUP BY fname, lname, mytext, morevar
ORDER BY id;