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,用存储过程完成拆分及插入操作。
代码实现
View Code
图示效果:
执行代码后的结果如图:
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
图示效果:
执行代码后的结果如图:
相关文章推荐
- mysql语句从一个表中查询出数据,再插入到另一张表中(表字段不一样)
- mysql读取一张表中的字段循环插入另一张表
- MySQL 将查询结果,加入一个自定义固定值字段,插入另外一张表
- 存储过程如何向一张表中循环插入1000条数据和字段二进制转换
- mysql的字段为bit时,插入数据报Data too long
- oracle存储过程将某张表一个字段的多值分开成多条数据插入到一张新表
- mysql将一个库中表的某几个字段插入到另一个库中的表
- MySQL 创建数据库、创建表、插入字段及其与通过Web 服务器交互时注意事项
- Mysql 将一张表的数据插入到另一张表中
- mysql根据另一张表内容修改字段
- SQL如何在已有的一张表中插入一列类型为INTEGER数据 并赋初始值为0
- mysql通过sql语句判断某个字段在一张表中是否存在
- MySQL 从一张表update字段到另外一张表中
- 在mysql中实现字段记录修改时间而不是插入时间
- 当数据库字段涉及到mysql保留字,插入数据不成功
- mysql 如何插入一列自增序号
- PHP操作MySQL对表增加一列(一个字段)
- MySql将查询结果插入到另外一张表
- mysql字段类型为int默认null,插入却显示0的解决办法,参考php代码
- sql 根据指定条件获取一个字段批量获取数据插入另外一张表字段中+MD5加密