阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL 拼接Insert批量同步异构表数据

137次阅读
没有评论

共计 2060 个字符,预计需要花费 6 分钟才能阅读完成。

需求:线上部分表数据需要同步到测试环境,但是测试环境表结构又有变更,额外添加需求:原线上和测试都有的表字段同步,其他不同的字段不用同步,置为 NULL 即可。

思路:首先导出线上表数据到测试的 test 库,考虑到两边表结构有变更,只能使用 insert tab1(xx,xx) select xx,xx from tab1 的方式插入,表比较多,手动对比所有字段工作量比较大,准备采用 SQL 拼接的方式拼接出插入的 SQL 去执行

实现过程:

1、将目标端要同步的数据库导入到测试端的 test 下面

2、创建同步信息表,并整理对应关系插入数据:

CREATE TABLE `z_tab_sync` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`from_db` VARCHAR(100) DEFAULT NULL,

`from_tab` VARCHAR(100) DEFAULT NULL,

`to_db` VARCHAR(100) DEFAULT NULL,

`to_tab` VARCHAR(100) DEFAULT NULL,

KEY `id` (`id`)

) ENGINE=INNODB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

 

其中 from_tab 是目标端的表,to_tab 是测试端的表

id  from_db  from_tab              to_db      to_tab

——  ——-  ———————  ———-  ————————-

1  test    business_history      tenancy_db  business_history

2  test    data_number            tenancy_db  data_number

3  test    house                  tenancy_db  house

4  test    house_process          tenancy_db  house_process

5  test    landlord              tenancy_db  landlord

6  test    landlord_process      tenancy_db  landlord_process

7  test    order_info            tenancy_db  decorate_order_info

8  test    order_process          tenancy_db  decorate_order_process

9  test    payment_record_stream  tenancy_db  decorate_payment_record

10  test    repayment_plan        tenancy_db  decorate_repayment_plan

11  test    shop_area              tenancy_db  shop_area

 

使用如下 SQL 拼接出要执行的 SQL

SELECT CONCAT(‘insert into `’,b.to_tab,’`(‘,GROUP_CONCAT(CONCAT(‘`’,a.column_name,’`’)),’) select ‘,GROUP_CONCAT(CONCAT(‘`’,a.column_name,’`’)),’ from ‘,a.from_tab,’;’)

FROM

(

SELECT

ts.id,

ts.from_tab,

cl.column_name

FROM

information_schema.`COLUMNS` cl

LEFT JOIN test.`z_tab_sync` ts

ON cl.table_name = ts.from_tab

WHERE table_schema = ‘test’

AND ts.id IS NOT NULL ) a,

(

SELECT

ts.id,

ts.to_tab,

cl.column_name

FROM

information_schema.`COLUMNS` cl

LEFT JOIN test.`z_tab_sync` ts

ON cl.table_name = ts.to_tab

WHERE table_schema = ‘tenancy_db’

AND ts.id IS NOT NULL ) b

WHERE a.id = b.id AND a.column_name = b.column_name

GROUP BY a.id;

 

得到的 SQL 形如

INSERT INTO `business_history` (

`settlementId`,

`businessType`,

`updateTime`,

`status`,

`createTime`,

`id`

)

SELECT

`settlementId`,

`businessType`,

`updateTime`,

`status`,

`createTime`,

`id`

FROM

business_history ;

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-07/145977.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2060字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中