• 博客访问: 2078236
  • 博文数量: 160
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-14 10:49
  • 认证徽章:
个人简介

每个人都有梦想,去实现吧!

文章分类

全部博文(160)

文章存档

2017年(11)

2016年(18)

2015年(36)

2014年(80)

2013年(15)

分类: MySQL

2017-07-25 17:52:01

需求:线上部分表数据需要同步到测试环境,但是测试环境表结构又有变更,额外添加需求:原线上和测试都有的表字段同步,其他不同的字段不用同步,置为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 ;
阅读(1906) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册

/xyw/234B.html /8888/270S.html /55901/833H.html /daxue/401I.html /bosoo/740n.html /8848/046Q.html /bg88/763B.html /bbsy/204g.html /bbs/511Y.html /8888/152O.html /gupiao/766G.html /gupiao/378g.html /88410/731i.html /bg88/383A.html /ks/065y.html /bosoo/561f.html /1088/120G.html /888/301g.html /3088/066N.html /wb/372e.html /0088/725i.html /wb/673k.html /3088/604q.html /88410/265F.html /888/166n.html /ymw/247q.html /daxue/638S.html /8888/388k.html /3088/170y.html /xyw/067y.html /bbs/251J.html /gpw/344L.html /daxue/188o.html /gpw/232n.html /daxue/215Z.html /8848/424C.html /bg88/206Y.html /bbsy/272n.html /daxue/386H.html /pmw/770M.html /ks/381A.html /bbs/857J.html /8848/832D.html /88410/565I.html /1088/863F.html /8848/738P.html