MySQL表的重复记录

MySQL表的重复记录,mysql,sql,Mysql,Sql,我有一个大约有400万条记录的表。我想让它有2.4亿,就像这样: 添加一个类型为BIGINT的附加列, 导入59倍于我已有的数据, 对于每400万组记录,增加一个列以获得不同的值 附加列的值将来自另一个表 所以我有这些记录,除了我有400万份,而不仅仅是3份: | id | value | +----+-------+ | 1 | 123 | | 2 | 456 | | 3 | 789 | | id | value | data | +----+-------+------+

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

添加一个类型为BIGINT的附加列, 导入59倍于我已有的数据, 对于每400万组记录,增加一个列以获得不同的值 附加列的值将来自另一个表

所以我有这些记录,除了我有400万份,而不仅仅是3份:

| id | value |
+----+-------+
| 1  | 123   |
| 2  | 456   |
| 3  | 789   |
| 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    |
我想实现这一目标,但我想要60份,而不仅仅是3份:

| id | value |
+----+-------+
| 1  | 123   |
| 2  | 456   |
| 3  | 789   |
| 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导出数据。。输入到输出文件…,然后使用加载数据填充重新导入它。。。但它确实慢得令人痛苦

有没有快速的方法可以做到这一点


谢谢大家!

首先,我建议您创建一个新表。可以使用交叉连接来执行此操作:


我不知道你为什么想要这个专栏的bigint。如果您真的需要,您可以强制转换为unsigned。

听起来您希望使用两个表的笛卡尔乘积并创建一个新表,因为您说附加列的值将来自另一个表?如果是这样的话,类似的方法应该会奏效:

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?如果是这样,您可以使用自动增量字段。但是,如果原始行不是连续的,这可能会弄乱它们。

嗯。您需要将表与范围交叉连接。这一行中的某些东西:

INSERT INTO table (id,value,data) SELECT id, value from table 
    CROSS JOIN (SELECT 2 UNION SELECT 3 UNION ... SELECT 60) AS data;
使用此答案作为数字范围的参考。

这里有一个想法

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亿行,这仍然会有点慢:-

创建一个id为自动增量的新表,然后只运行60次?插入到新的\u表值、数据选择值、旧\u表中的id您确定一个2.4亿行的事务处理比60个400万行的事务处理好吗?@MatBailie它肯定比60个outfiles快。@MatBailie。我不知道MySQL的具体情况。对于具有单个事务的新表,不需要记录插入操作。如果语句失败,只需删除该表即可。我不知道MySQL是否有这种优化,但它会在CREATETABLE as中,而不是insert中。这些结果与ops不匹配results@MatBailie-仅示例数据:谢谢@sgedes,我不知道我想要的是cartesion产品。我已将您的答案标记为已接受,但我无法在我的数据库上运行您的查询,因为我的计算机没有足够的RAM。所以我这样做了:插入到你的新表中,从表t中选择t.id,t.value,a.data,1,然后插入到你的新表中,从表t中选择t.id,t.value,a.data,2,依此类推,直到我不能再插入为止。