我有一张大约有400万条记录的表格。我想让它有2.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 ...
),但实际上非常缓慢。
有快速的方法吗?
谢谢!
答案 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亿行,这仍然会有点慢: - (