您的位置:首页 > 数据库 > MySQL

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

2013-10-30 13:55 330 查看
环境描述:

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,用存储过程完成拆分及插入操作。

代码实现

# 函数:func_split_TotalLength
DELIMITER $$
DROP function IF EXISTS `func_split_TotalLength` $$
CREATE  FUNCTION `func_split_TotalLength`
(f_string varchar(1000),f_delimiter varchar(5)) RETURNS int(11)
BEGIN
# 计算传入字符串的总length
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
END$$
DELIMITER;

# 函数:func_split
DELIMITER $$
DROP function IF EXISTS `func_split` $$
CREATE FUNCTION `func_split`
(f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
BEGIN
# 拆分传入的字符串,返回拆分后的新字符串
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
END$$
DELIMITER;

# 存储过程:splitString
DELIMITER $$
DROP PROCEDURE IF EXISTS `splitString` $$
CREATE PROCEDURE `splitString`
(IN f_string varchar(1000),IN idstr int, IN f_delimiter varchar(5))
BEGIN
# 拆分结果
declare cnt int default 0;
declare i int default 0;
set cnt = func_split_TotalLength(f_string,f_delimiter);
DROP TABLE IF EXISTS `tmp_split`;
create temporary table `tmp_split` (`status` varchar(128) not null,`ids` int ) DEFAULT CHARSET=utf8;
while i < cnt
do
set i = i + 1;
insert into tmp_split(`status`,`ids`) values (func_split(f_string,f_delimiter,i),idstr);
end while;
END$$
DELIMITER;

# 插入分隔数据
DELIMITER $$
DROP PROCEDURE IF EXISTS `valinsert` $$
CREATE PROCEDURE `valinsert` ()
BEGIN
declare imageid int default 0;
declare tmpName varchar(100) default '' ;
declare tmpImage varchar(500) default '' ;
-- 定义游标
declare cur1  CURSOR FOR SELECT image FROM shop_goods ;
DECLARE cur2     CURSOR FOR SELECT goodsid FROM shop_goods;
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpName = null;
-- 开游标
OPEN cur1 ;
OPEN cur2;
FETCH cur1 INTO tmpImage;
FETCH cur2 INTO imageid;
-- 清空带插入的表
TRUNCATE  shop_goods_image;
WHILE ( tmpName is not null) DO
-- 调取分隔字段的存储过程splitString
call splitString(tmpImage,imageid,";");
INSERT INTO shop_goods_image (location,shop_goods_id) SELECT status,ids from tmp_split;
FETCH cur1 INTO tmpImage;
FETCH cur2 INTO imageid;
END WHILE;
CLOSE cur1;
CLOSE cur2;
select * from shop_goods_image;
END$$
DELIMITER;

call valinsert();


View Code

图示效果:



执行代码后的结果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: