mysql insert 分号_Mysql数据迁移——按分号split一列字段插入另一张表

环境描述:

Mysql5.0.22

navicat10

问题描述:

shopgoods里面的字段image保存着多张相关商品的图片URL地址,如:

/resources/../upload-photo/commodity/20130428/75331367132321640.jpg;/resources/../upload-photo/commodity/20130428/92551367132322015.jpg;/resources/../upload-photo/commodity/20130428/17351367132322046.jpg;/resources/../upload-photo/commodity/20130428/5651367132322203.jpg;/resources/../upload-photo/commodity/20130428/92591367132322234.jpg;

现要将这一字段外键关联到另一张表,将字段分隔(split)为单个路径,并绑定shopgoods的主键id,用存储过程完成拆分及插入操作。

代码实现

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 # 函数:func_split_TotalLength2 DELIMITER $$3 DROP function IF EXISTS`func_split_TotalLength` $$4 CREATE FUNCTION`func_split_TotalLength`5 (f_string varchar(1000),f_delimiter varchar(5)) RETURNS int(11)6 BEGIN

7 # 计算传入字符串的总length8 return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));9 END$$10 DELIMITER;11

12 # 函数:func_split13 DELIMITER $$14 DROP function IF EXISTS`func_split` $$15 CREATE FUNCTION`func_split`16 (f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf817 BEGIN

18 # 拆分传入的字符串,返回拆分后的新字符串19 declare result varchar(255) default '';20 set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));21 returnresult;22 END$$23 DELIMITER;24

25 # 存储过程:splitString26 DELIMITER $$27 DROP PROCEDURE IF EXISTS`splitString` $$28 CREATE PROCEDURE`splitString`29 (IN f_string varchar(1000),IN idstr int, IN f_delimiter varchar(5))30 BEGIN

31 # 拆分结果32 declare cnt int default 0;33 declare i int default 0;34 set cnt =func_split_TotalLength(f_string,f_delimiter);35 DROP TABLE IF EXISTS`tmp_split`;36 create temporary table `tmp_split` (`status` varchar(128) not null,`ids` int ) DEFAULT CHARSET=utf8;37 while i

45 # 插入分隔数据46 DELIMITER $$47 DROP PROCEDURE IF EXISTS`valinsert` $$48 CREATE PROCEDURE`valinsert` ()49 BEGIN

50 declare imageid int default 0;51 declare tmpName varchar(100) default '';52 declare tmpImage varchar(500) default '';53 --定义游标

54 declare cur1 CURSOR FOR SELECT image FROMshop_goods ;55 DECLARE cur2 CURSOR FOR SELECT goodsid FROMshop_goods;56 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpName = null;57 --开游标

58 OPENcur1 ;59 OPENcur2;60 FETCH cur1 INTOtmpImage;61 FETCH cur2 INTOimageid;62 --清空带插入的表

63 TRUNCATEshop_goods_image;64 WHILE ( tmpName is not null) DO65 --调取分隔字段的存储过程splitString

66 call splitString(tmpImage,imageid,";");67 INSERT INTO shop_goods_image (location,shop_goods_id) SELECT status,ids fromtmp_split;68 FETCH cur1 INTOtmpImage;69 FETCH cur2 INTOimageid;70 END WHILE;71 CLOSEcur1;72 CLOSEcur2;73 select * fromshop_goods_image;74 END$$75 DELIMITER;76

77 call valinsert();

View Code

图示效果:

fdd260c2f5689bef7ec8e38591a4344f.png

执行代码后的结果如图:

999d1a30021d349a1ebae6b5ecab0d97.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值