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