请求编写SQL脚本:将200万行大表拆分多个无重叠20万行子表
拆分大表为固定行数子表的SQL脚本
核心思路
通过为原表记录分配唯一行号(或利用现有主键),按行号范围将数据拆分到不同子表,确保每个子表包含20万条无重叠记录。以下是主流数据库的实现方案:
MySQL/MariaDB 实现
假设原表名为large_table,优先使用主键id保证顺序:
1. 创建子表(重复执行10次,修改表名即可)
CREATE TABLE sub_table_1 LIKE large_table;
2. 拆分插入数据
-- 第1个子表:1-200000条 INSERT INTO sub_table_1 SELECT * FROM large_table ORDER BY id LIMIT 200000 OFFSET 0; -- 第2个子表:200001-400000条 INSERT INTO sub_table_2 SELECT * FROM large_table ORDER BY id LIMIT 200000 OFFSET 200000; -- ... 以此类推 -- 第10个子表:1800001-2000000条 INSERT INTO sub_table_10 SELECT * FROM large_table ORDER BY id LIMIT 200000 OFFSET 1800000;
如果原表无主键,用变量生成行号:
SET @row_num = 0; INSERT INTO sub_table_1 SELECT * FROM ( SELECT *, (@row_num := @row_num + 1) AS row_id FROM large_table ORDER BY create_time -- 替换为实际排序字段 ) AS temp WHERE row_id BETWEEN 1 AND 200000;
PostgreSQL 实现
使用窗口函数ROW_NUMBER()更高效:
-- 创建第1个子表并插入数据 CREATE TABLE sub_table_1 AS SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row_id FROM large_table ) AS temp WHERE row_id BETWEEN 1 AND 200000; -- 创建第2个子表 CREATE TABLE sub_table_2 AS SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row_id FROM large_table ) AS temp WHERE row_id BETWEEN 200001 AND 400000; -- ... 直到第10个子表
SQL Server 实现
用SELECT INTO直接创建并填充子表:
-- 第1个子表 SELECT * INTO sub_table_1 FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row_id FROM large_table ) AS temp WHERE row_id BETWEEN 1 AND 200000; -- 第2个子表 SELECT * INTO sub_table_2 FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS row_id FROM large_table ) AS temp WHERE row_id BETWEEN 200001 AND 400000;
注意事项
- 执行前务必备份原表,防止数据丢失
- 子表建议同步创建原表的索引,避免查询性能下降
- 无主键时,
ORDER BY必须指定明确字段,保证记录顺序稳定,避免拆分出现重复或遗漏 - 大数据量插入时,可关闭自动提交(如MySQL的
SET AUTOCOMMIT=0;),减少事务开销
内容的提问来源于stack exchange,提问作者Ado Dixn
相关产品推荐
相关产品推荐

