20_union_lost_rows.sql
4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
-- 补进"只存在于副本"的行(六库合一的唯一数据搬运动作)
--
-- 由 sql/tools/gen_migration_sql.py 生成 —— 列清单现算,不要手改本文件
-- 判定依据见 ../merge-conflict-plan.md §2.2 / §2.3 / §5
--
-- 🚫 **抽样镜像(SAMPLE=N)不要跑本文件。** 它的前提是"保留侧已被完整灌入"——
-- 抽样镜像里保留侧只抽了几百行,此时往丢弃侧取"目标库还没有的行",取到的会是
-- 几乎所有行(几亿行里的绝大部分),既没有意义也可能把开发库撑爆。
--
-- 前提:本文件在**目标库所在实例**上执行,且六个源库还在同一实例上
-- (六库同实例已实测,见 ../legacy-db-actual.md §1)
-- 顺序:先按 10_dump_legacy.sh 把保留侧灌进 parking_cloud,再执行本文件
--
-- ⚠️ **执行时机(别当成一个可以随便穿插的步骤)**
--
-- 本文件的判据是"**丢弃侧**里目标库还没有的行"(NOT EXISTS)。也就是说:
-- 本文件跑完之后,谁再往丢弃侧写一行,那行就永远不会进目标库——
-- 而这正是它要搬的那 29 行客户数据同一类的漏。
--
-- 所以正确顺序是:
-- 停写/切流 → ③ load → ④ 本文件 → ⑤ 99 校验(+ 98 全表对账)→ 放流量到新库
-- 不是"搬完随手跑一下"。绝不能在写流量还指向老库副本时先跑一遍了事。
--
-- ⚠️ td_b_wx_config 含微信支付密钥。本文件只有列名、没有任何值——
-- 密钥值由 INSERT ... SELECT 在库间直接流动,不落盘。
-- 请勿"为了方便"改成带值的 INSERT。
-- ---------------------------------------------------------------------------
-- td_c_cust_person:把只存在于 zt_order_n.td_c_cust_person 的行补进 parking_cloud.td_c_cust_person
-- 判重键 cust_id(两侧 id 空间不同,不能按 id 判重,也不能带 id 插入)
-- 可插入列 35 个(= 两侧交集 − auto_increment 的 id)
-- ---------------------------------------------------------------------------
INSERT INTO `parking_cloud`.`td_c_cust_person` (`cust_id`, `cust_name`, `cust_nickname`, `user_name`, `user_password`, `user_phone`, `sex`, `email`, `cust_type`, `parent_id`, `cer_type`, `cer_number`, `deivce_type`, `device_no`, `token_id`, `prov_id`, `city_id`, `area_id`, `alias`, `remark`, `petty_pay_state`, `petty_pay_pass`, `petty_pay_amount`, `msg_push_state`, `direct_debit_state`, `data_state`, `create_empid`, `create_date`, `modfiy_empid`, `modfiy_date`, `address`, `head_pic_url`, `birth_date`, `org_id`, `org_name`)
SELECT d.`cust_id`, d.`cust_name`, d.`cust_nickname`, d.`user_name`, d.`user_password`, d.`user_phone`, d.`sex`, d.`email`, d.`cust_type`, d.`parent_id`, d.`cer_type`, d.`cer_number`, d.`deivce_type`, d.`device_no`, d.`token_id`, d.`prov_id`, d.`city_id`, d.`area_id`, d.`alias`, d.`remark`, d.`petty_pay_state`, d.`petty_pay_pass`, d.`petty_pay_amount`, d.`msg_push_state`, d.`direct_debit_state`, d.`data_state`, d.`create_empid`, d.`create_date`, d.`modfiy_empid`, d.`modfiy_date`, d.`address`, d.`head_pic_url`, d.`birth_date`, d.`org_id`, d.`org_name`
FROM `zt_order_n`.`td_c_cust_person` d
WHERE NOT EXISTS (
SELECT 1 FROM `parking_cloud`.`td_c_cust_person` k WHERE k.`cust_id` = d.`cust_id`
);
-- ---------------------------------------------------------------------------
-- td_b_wx_config:把只存在于 zt_order.td_b_wx_config 的行补进 parking_cloud.td_b_wx_config
-- 判重键 appid(两侧 id 空间不同,不能按 id 判重,也不能带 id 插入)
-- 可插入列 14 个(= 两侧交集 − auto_increment 的 id)
-- ---------------------------------------------------------------------------
INSERT INTO `parking_cloud`.`td_b_wx_config` (`appid`, `app_secret`, `is_encrypt_message`, `encoding_aes_key`, `mchid`, `pay_api_secret`, `data_state`, `is_pay_noCredit`, `org_id`, `remark`, `create_op`, `create_date`, `modify_op`, `modify_date`)
SELECT d.`appid`, d.`app_secret`, d.`is_encrypt_message`, d.`encoding_aes_key`, d.`mchid`, d.`pay_api_secret`, d.`data_state`, d.`is_pay_noCredit`, d.`org_id`, d.`remark`, d.`create_op`, d.`create_date`, d.`modify_op`, d.`modify_date`
FROM `zt_order`.`td_b_wx_config` d
WHERE NOT EXISTS (
SELECT 1 FROM `parking_cloud`.`td_b_wx_config` k WHERE k.`appid` = d.`appid`
);