You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:16:04