【YashanDB知识库】如何处理报错"UDT column batch insert" has not been implemented yet

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【YashanDB知识库】如何处理报错"UDT column batch insert" has not been implemented yet

本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802963.html?templateId=1718516

问题现象

YashanDB中的ST_GEOMETRY类型是数据库内置的一种自定义类型,用于存储和访问符合开放地理空间信息联盟(Open Geospatial Consortium,简称OGC)制定的SFA SQL标准的几何对象。详细可查看 ST_GEOMETRY | YashanDB Doc

在批量插入(例如insert into select或使用yasldr导入数据)的时候, 如果表有ST_GEOMETRY类型的字段, 则会报错YAS-00004 feature "UDT column batch insert" has not been implemented yet

IMG_256

问题的风险及影响

影响ST_GEOMETRY类型的数据导入

问题影响的版本

YashanDB版本:23.2.7.100及以下

解决方法及规避方式

问题的原因

YashanDB的GIS功能是通过UDT实现的,目前用户自定义类型UDT还不支持批量插入。在表存在GEO相关字段的时候,即使插入的字段不包含GEO的字段,但是存储每一行都会预留相应的字段空间,因此也会失败。

解决办法

1、普通迁移数据可以使用YMP解决

源端是YashanDB,表字段是ST_GEOMETRY类型的,可以通过YMP迁移数据到目标端YashanDB。详见YMP使用指导 快速开始 | YashanDB Doc

2、在单表数据量小,想通过SQL命令快速迁移,可以使用如下方法规避实现:

举例,如CREATE TABLE t1(id INT, pos ST_GEOMETRY); 需要将T1的数据导出到目标库

1)在源库表将geo字段转成clob(转换函数st_astext),通过exp导出

exp --csv -f csv -u user -p passwd --server-host 127.0.0.0.1:1688 -q 'SELECT id,ST_ASTEXT(pos) from t1'
AI 代码解读

2)在目标库建立临时表, 上传步骤1)导出的数据t1.outfile将数据通过yasldr导入clob字段

CREATE TABLE t2(id INT, pos_str clob);

​

[yashan@localhost ~]$ cat t2.load.template

LOAD DATA OPTIONS(DEGREE_OF_PARALLELISM=8,STATS=TRUE)

INFILE '/home/yashan/t1.outfile' WITH EMBEDDED FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'

APPEND INTO TABLE t2 trailing nullcols("ID","POS_STR")

​

yasldr user/passwd@127.0.0.0.1:1688 batch_size=4032 control_file=/home/yashan/t2.load.template
AI 代码解读

3)通过ST_GEOMFROMTEXT转换成ST_GEOMETRY类型

alter table t2 add "POS" "MDSYS"."ST_GEOMETRY";

update t2 set pos = st_geomfromtext(POS_STR);

alter table t2 drop POS_STR;
AI 代码解读

4)小结

通过上述的步骤方法将ST_GEOMETRY类型转换成CLOB,再导入到目标表之后通过ST_GEOMFROMTEXT转换回来,在现有工具下即可实现对ST_GEOMETRY类型的搬迁。

特别需要注意的是,在目标库同样建立表的时候,同时带clob、ST_GEOMETRY类型,通过yasldr或insert into select仅导入clob字段(insert列不带ST_GEOMETRY字段),会失败,需要建表的时候不带ST_GEOMETRY字段,在导入数据之后再添加字段,通过update更新ST_GEOMETRY字段(从clob字段转换数据回来)。

在崖山团队目前已经在实现UDT字段支持批量插入,insert into select/yasldr/exp/imp后续均可以支持UDT字段,敬请留意后续版本。

目录
打赏
0
2
2
0
96
分享
相关文章
|
1天前
|
SQL
【YashanDB 知识库】YAS-04115 "SELECT" expected but missing
【YashanDB 知识库】YAS-04115 "SELECT" expected but missing
【YashanDB知识库】lYAS-02143 invalid username/password, login denied
【YashanDB知识库】lYAS-02143 invalid username/password, login denied
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
【YashanDB 知识库】YCM Monit 进程频繁误告警
【YashanDB 知识库】YCM Monit 进程频繁误告警
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空
【YashanDB知识库】使用DBeaver 插入数据 nvarchar字段插入为空
【YashanDB知识库】YDC无法通过conn切换用户
【YashanDB知识库】YDC无法通过conn切换用户
【YashanDB知识库】YDC无法通过conn切换用户
|
1天前
|
SQL
【YashanDB 知识库】并发 update 报错 YAS-02208 lock conflict in consistent write
【YashanDB 知识库】并发 update 报错 YAS-02208 lock conflict in consistent write
【YashanDB 知识库】druid 连接池做断网测试,无法自动重新连接
【YashanDB 知识库】druid 连接池做断网测试,无法自动重新连接
【YashanDB 知识库】Hive 命令工具 insert 崖山数据库报错
【YashanDB 知识库】Hive 命令工具 insert 崖山数据库报错

数据库

+关注