MySQL表的重复记录

时间:2014-05-15 13:37:48

标签: mysql sql

我有一张大约有400万条记录的表格。我想让它有2.4亿像这样:

  1. 添加BIGINT类型的附加列,
  2. 导入我已有数据的59倍,
  3. 对于每个400万条记录组,要使附加列具有不同的值
  4. 附加列的值来自另一个表。

    所以我有这些记录(除了我有4百万个而不仅仅是3个):

    | id | value |
    +----+-------+
    | 1  | 123   |
    | 2  | 456   |
    | 3  | 789   |
    

    我想实现这个目标(除了我想要60份而不仅仅是3份):

    | id | value | data |
    +----+-------+------+
    | 1  | 123   | 1    |
    | 2  | 456   | 1    |
    | 3  | 789   | 1    |
    | 4  | 123   | 2    |
    | 5  | 456   | 2    |
    | 6  | 789   | 2    |
    | 7  | 123   | 3    |
    | 8  | 456   | 3    |
    | 9  | 789   | 3    |
    

    我尝试导出我的数据(使用SELECT .. INTO OUTFILE ...),然后重新导入它(使用LOAD DATA INFILE ...),但实际上非常缓慢。

    有快速的方法吗?

    谢谢!

4 个答案:

答案 0 :(得分:1)

首先,我建议您创建一个新表。您可以使用cross join

执行此操作
create table WayBigTable as 
    select t.*, n
    from table t cross join
         (select 1 as n union all select 2 union all select 3 union all select 4 union all select 5 union all
         . . .
          select 60
         ) n;

我不确定您为什么要为此列添加bigint。如果您确实需要,可以转换为unsigned

答案 1 :(得分:1)

听起来你想说cartesian product,因为你想从2个表的The value of the additional column would come from another table中创建一个新表?如果是这样,这样的事情应该有效:

create table yourtable (id int, value int);
create table yournewtable (id int, value int, data int);
create table anothertable (data int);

insert into yourtable values (1, 123), (2, 456), (3, 789);
insert into anothertable values (1), (2), (3);

insert into yournewtable
select t.id, t.value, a.data
from yourtable t, anothertable a

结果:

ID  VALUE DATA
1   123   1
2   456   1
3   789   1
1   123   2
2   456   2
3   789   2
1   123   3
2   456   3
3   789   3

编辑,旁注 - 看起来你新表中的ID字段不会重复相同的ID吗?如果是这样,您可以改为使用AUTO_INCREMENT字段。但是,如果它们不是连续的,这可能会弄乱原始行。

答案 2 :(得分:0)

嗯。您需要将表格与范围交叉连接。有点像这样:

INSERT INTO table (id,value,data) SELECT id, value from table 
    CROSS JOIN (SELECT 2 UNION SELECT 3 UNION ... SELECT 60) AS data;

使用此回答Generating a range of numbers in MySQL作为号码范围的参考。

答案 3 :(得分:0)

这是一个想法...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,value INT NOT NULL
);

INSERT INTO my_table VALUES
(1  ,123),
(2  ,456),
(3  ,789);

ALTER TABLE my_table ADD COLUMN data INT NOT NULL DEFAULT 1;

SELECT * FROM my_table;
+----+-------+------+
| id | value | data |
+----+-------+------+
|  1 |   123 |    1 |
|  2 |   456 |    1 |
|  3 |   789 |    1 |
+----+-------+------+


SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

INSERT INTO my_table SELECT NULL,value,data+i2.i*10+i1.i+1 FROM my_table,ints i1,ints i2;


SELECT * FROM my_table;
+-----+-------+------+
| id  | value | data |
+-----+-------+------+
|  1  |   123 |    1 |
|  2  |   456 |    1 |
|  3  |   789 |    1 |
|  4  |   123 |    2 |
|  5  |   456 |    2 |
|  6  |   789 |    2 |
|  7  |   123 |    3 |
|  8  |   456 |    3 |
...
... 
| 296 |   456 |   97 |
| 297 |   789 |   97 |
| 298 |   123 |   98 |
| 299 |   456 |   98 |
| 300 |   789 |   98 |
| 301 |   123 |   99 |
| 302 |   456 |   99 |
| 303 |   789 |   99 |
+-----+-------+------+
303 rows in set (0.00 sec)

注意,对于2.4亿行,这仍然会有点慢: - (