从t1复制到新表t2过滤掉重复的行

时间:2013-07-11 00:59:20

标签: mysql sql mysql-error-1136

我有一个表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

3 个答案:

答案 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;