zoukankan      html  css  js  c++  java
  • 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,用存储过程完成拆分及插入操作。

    代码实现

     1 # 函数:func_split_TotalLength 
     2 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     # 计算传入字符串的总length 
     8     return 1+(length(f_string) - length(replace(f_string,f_delimiter,''))); 
     9 END$$ 
    10 DELIMITER; 
    11 
    12 # 函数:func_split 
    13 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 utf8 
    17 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         return result; 
    22 END$$ 
    23 DELIMITER; 
    24 
    25 # 存储过程:splitString 
    26 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 < cnt 
    38 do 
    39     set i = i + 1; 
    40     insert into tmp_split(`status`,`ids`) values (func_split(f_string,f_delimiter,i),idstr); 
    41 end while; 
    42 END$$ 
    43 DELIMITER; 
    44 
    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 FROM shop_goods ;
    55     DECLARE cur2     CURSOR FOR SELECT goodsid FROM shop_goods;
    56     declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpName = null;
    57 -- 开游标 
    58     OPEN cur1 ;
    59     OPEN cur2;
    60     FETCH cur1 INTO tmpImage;
    61     FETCH cur2 INTO imageid;
    62     -- 清空带插入的表
    63     TRUNCATE  shop_goods_image;
    64     WHILE ( tmpName is not null) DO
    65         -- 调取分隔字段的存储过程splitString
    66         call splitString(tmpImage,imageid,";");
    67         INSERT INTO shop_goods_image (location,shop_goods_id) SELECT status,ids from tmp_split; 
    68         FETCH cur1 INTO tmpImage;
    69         FETCH cur2 INTO imageid;
    70     END WHILE;
    71     CLOSE cur1;
    72     CLOSE cur2;
    73 select * from shop_goods_image; 
    74 END$$ 
    75 DELIMITER; 
    76 
    77 call valinsert();
    View Code

    图示效果:

    执行代码后的结果如图:

  • 相关阅读:
    布局重用 include merge ViewStub
    AS 常用插件 MD
    AS 2.0新功能 Instant Run
    AS .ignore插件 忽略文件
    AS Gradle构建工具与Android plugin插件【大全】
    如何开通www国际域名个人网站
    倒计时实现方案总结 Timer Handler
    AS 进行单元测试
    RxJava 设计理念 观察者模式 Observable lambdas MD
    retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】
  • 原文地址:https://www.cnblogs.com/qsl568/p/3396562.html
Copyright © 2011-2022 走看看