需求
需要把t_achievement表的所属公司id(company_id)、所属公司名称(company_name)、insert_time字段迁移到t_achievement_company_map表,其中company_id和company_name都是通过"、"拼接。这个时候就需要根据分隔符将一行数据拆分成多行数据。t_achievement_company_map表结构如下图所示:
1 | CREATE TABLE `t_achievement_company_map` ( |
关键函数
substring_index(str,delim,count)
- str是要处理的字符串
- delim是分隔符
- count如果是正数从左往右计数,如果是负数从右往左计数
举几个例子:
1 | -- 返回550000 |
迁移步骤(方法一)
先查询出cmpany_id字段长度最大的记录
1 | SELECT MAX(length(company_id)) FROM t_achievement; |
往auto_increment表插入数据
auto_increment表的建表sql如下:
1 | CREATE TABLE `auto_increment` ( |
上面查询出的最大company_id为"110000、120000、130000、150000、170100、490200"。所以至少需要在auto_increment表中插入6条记录。
开始迁移
如果有些company_id不足6个就会重复,加入DISTINCT去重就行。具体代码如下:
1 | INSERT INTO t_achievement_company_map(TYPE,achievement_id,company_id,company_name,insert_time) |
迁移步骤(方法二)
利用MySQL的help_topic中的help_topic_id,即把auto_increment 替换为mysql.help_topic、id替换为help_topic_id。具体代码如下:
1 | INSERT INTO test.t_achievement_company_map(TYPE,achievement_id,company_id,company_name,insert_time) |