MySQL加载数据插入,将值拆分为多行

MySQL load data insert, split values to multiple rows

提问人:kwangil lee 提问时间:11/6/2023 最后编辑:SelVazikwangil lee 更新时间:11/6/2023 访问量:80

问:

使用 LOAD DATA LOCAL INFILE

num 列 每 6 位数字存储一次

如何参数化 load 命令以遍历数组?

Mysql版本8.0.23

在文件文本中

id length 1,
cnt length 2,
num length 500
--------------------
1 3AB1001AB1002AB1003

表A

编号 碳纳米管 jué
1 3 AB1001AB1002AB1003

我想要像下表这样的输出

表B

编号 碳纳米管 jué
1 3 AB1001型
1 3 AB1002型
1 3 AB1003型
mysql 数据文件

评论

0赞 Nick 11/6/2023
您正在阅读的文件的内容是什么?请编辑您的问题以添加它们。此外,添加您正在使用的 MySQL 版本。
0赞 kwangil lee 11/6/2023
我们已经添加了您提到的内容
2赞 Akina 11/6/2023
将值拆分为多行在 LOAD DATA 中没有办法。加载到模板中,然后将加载的数据解析到主表中。
0赞 Shadow 11/6/2023
这里没有数组或 json。您需要将字符串绘制成子字符串。答:是的,这不能在加载数据文件的一个步骤中完成。

答:

0赞 netragon 11/6/2023 #1

您可以使用触发器将表“a”中的一行拆分为“b”的 3 行。 触发器如下:

`CREATE TRIGGER triger1 AFTER INSERT ON a FOR EACH ROW BEGIN
SET @i = 0;
REPEAT
SET @part = SUBSTRING(NEW.num, 1 + @i*6, 6);
INSERT INTO b VALUE(NEW.id, NEW.cnt, @part);
SET @i = @i + 1;
UNTIL @i = NEW.cnt
END REPEAT;
END;`

在使用 LOAD DATA LOCAL INFILE 插入数据之前,您必须在表 'a' 上创建一个触发器。 问候。

评论

0赞 netragon 11/6/2023
当插入到表 NEW.num 中的新行与 NEW.cnt 行拆分为 .ab
0赞 Bill Karwin 11/6/2023 #2

我能够测试这张表:

create table mytable (
  id int,
  cnt int,
  num varchar(500)
);

我把你显示的文本行放到一个文件中:p.csv

1 3AB1001AB1002AB1003

我运行了mysql客户端,并提供了启用本地数据加载的选项:

$ mysql --local-data

然后我以这种方式加载数据文件:

mysql> load data local infile 'p.csv' into table mytable (@temp)
set id = substr(@temp, 1, 1),
    cnt = substr(@temp, 2, 2),
    num = substr(@temp, 3);

成功了!

mysql> select * from mytable;
+------+------+---------------------+
| id   | cnt  | num                 |
+------+------+---------------------+
|    1 |    3 | 3AB1001AB1002AB1003 |
+------+------+---------------------+

在此处阅读有关 LOAD DATA INFILE 语句的更多信息:https://dev.mysql.com/doc/refman/8.0/en/load-data.html

并在此处阅读有关 SUBSTR() 函数的信息: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_substr