十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
import_table(importTable) 的延申功能:可定制化行输入。
创新互联-专业网站定制、快速模板网站建设、高性价比黔西南州网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式黔西南州网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖黔西南州地区。费用合理售后完善,十载实体公司更值得信赖。
import_table(importTable) 我们之前有介绍过,是一款并行导入各种格式文本的工具,封装了 MySQL 语句 load data local infile。
比如说要导入一个以 TAB 为分隔符的文本数据文件:/tmp/sample_ytt.txt 到表:ytt_new.t1,可以执行下面语句:
上面结果是 load data infile 语句的导入结果。如果改用 import_table 方法来做同样的事情,基于 Python 语法,使用方法如下:
那接下来看另外一个需求:在导入文本文件时对每行做预处理(例如在导入数据之前更改列 r2 的值为 mod(r1,10),列 r5 的值为 abs(r4-46) ),这样可以减少导入后再次处理的时间开销。
这个需求用 load data infile 语句非常容易实现:(导入时更改列 r2 和 r5 的数据,类似 UPDATE 语法)
那如果要用 util.import_table(importTable) 来实现上面的需求,在 MySQL 8.0.22 之前是没办法的。
随着 MySQL 8.0.22 的发布,MySQL 对 import_table 方法做了些扩充功能,其中增加了一个选项 “decodeColumns” 可以实现字段的预先输入定制化功能,并且还可以更加丰富。
接下来用 import_table 来实现上面的需求,定制化字段 r2 和 r5:
以上 Options 选项,见下图:
我来具体解释下上图的含义:蓝色字体 columns 对应的数组分别指定数据文件中的每行字段,也就是默认的 TAB 分隔符所分割的每列值,1 和 2 代表占位符,1 代表数据文件中每行的第一个列,2 代表数据文件中每行的第四列,decodeColumns 字典分别对需要预先输入的字段做处理。比如 r1 字段保留为变量 @1,r2 字段对应 mod(r1,10) 等。
如果还是不太理解变换规则,可以临时打开 general log, 上面 import_table(importTable)对应的 MySQL 日志为:
以上日志写的很清楚,内部转换为最基本的load data infile语法。
那这里我简单解读了下 MySQL 8.0.22 对 MySQL Shell 的一项定制化输入文本文件的新特性,更多的新特性可以继续关注。
确实不行,这是MYSQL的存储过程十分不完善的地方
我也找了很久,后来想了了个巧妙的方法
IF @i 30 THEN
-- 在这里抛出异常和取消 insert 操作
SELECT E001 INTO M_ERRMSG;
end if
1. MYSQL没有抛出异常的语句,MYSQL已经承认此语句为SIGNAL,目前还没封装.
2. 所以目前能做的是, 要在抛出异常的地方,插入一个错误语句
3. 这个错误语句只能是运行期错误语句,否则编译无法通过
4. 用SELELCT E001 INTO M_ERRMSG, 其中E001可以随便定义为一个不存在字段或函数, 因为这个错误是运行期错误,编译是可以通过的. 后面的INTO M_ERRMSG实际上没有什么用处, 因为SELECT 后面必须加INTO一个变量,否则编译也是不可以通过。
查看某个表的建表语句,可以使用phpmyadmin查看,首先选择这个表所在的数据库,比如:ecshop库,里面有个ecs_goods表,那么查看goods表的建表语句为:
show create
table ecs_goods
把这条sql语句复制到
点击执行,ok结果就出来了:
把显示的结果复制到其它机器上运行,就建好一张goods表了