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

MySQL 8.0.23中LOAD DATA拆分num字段为多行的实现方法

解决方法

1. 用LOAD DATA LOCAL INFILE导入生成表A

先创建表A的结构:

CREATE TABLE table_a (
    id CHAR(1) NOT NULL,
    cnt CHAR(2) NOT NULL,
    num VARCHAR(500) NOT NULL
);

通过固定长度参数化截取的方式导入数据,利用变量接收整行内容,再按指定长度拆分字段:

LOAD DATA LOCAL INFILE '/path/to/your/data.txt'
INTO TABLE table_a
FIELDS TERMINATED BY ''  -- 无字段分隔符,按固定位置截取
LINES TERMINATED BY '\n'
(@full_line)
SET
    id = SUBSTRING(@full_line, 1, 1),  -- 截取第1位作为id(长度1)
    cnt = SUBSTRING(@full_line, 2, 2),  -- 截取第2-3位作为cnt(长度2)
    num = SUBSTRING(@full_line, 4, 500);  -- 截取第4-503位作为num(长度500)

2. 将表A的num字段拆分生成表B

先创建表B的结构:

CREATE TABLE table_b (
    id CHAR(1) NOT NULL,
    cnt CHAR(2) NOT NULL,
    split_num CHAR(6) NOT NULL
);

利用MySQL 8.0支持的递归CTE实现按每6位拆分,自动生成多行数据:

WITH RECURSIVE split_nums AS (
    SELECT
        id,
        cnt,
        num,
        1 AS pos,
        SUBSTRING(num, 1, 6) AS split_num
    FROM table_a
    WHERE LENGTH(num) >= 6
    UNION ALL
    SELECT
        id,
        cnt,
        num,
        pos + 6,
        SUBSTRING(num, pos + 6, 6) AS split_num
    FROM split_nums
    WHERE pos + 6 <= LENGTH(num)
)
INSERT INTO table_b (id, cnt, split_num)
SELECT id, cnt, split_num
FROM split_nums
WHERE split_num IS NOT NULL;

如果需要过滤掉最后不足6位的片段,可在最后SELECT语句中添加WHERE LENGTH(split_num) = 6。


内容的提问来源于stack exchange,提问作者kwangil lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:22:38