Browse Source

docs(进件): 交付 SQL 补上「删哪一行」的三条实测依据(只改注释,无 DDL 变化)

`lsy-merchant-mch-no-uk.sql` 是待用户执行的交付件(GC6:SQL 由用户执行)。
本次只补证据,不动任何 DDL 与语句。

三条新实测:
1. **删除不会让别的表悬空** —— information_schema 里没有任何外键指向
   pay_lsy_merchant;全库带 mch_no 列的表只有 pay_lsy_merchant(2 行) 与
   pay_lsy_order(9 行引用该商户号),且 order 存的是字符串 mch_no 而非本表 id。
2. **推荐删候选 A(id=1)** —— 它的 description 是数据自己写的处置说明
   (「正式进件(子项目 B)后应删除」),子项目 B 即本批次、已完成;
   候选 B 无此自述,且占着 tenant 2 的租户级槽位。
3. **这条缺口现在是活的** —— 原注释写「Task 6 当时尚未实现」,现已过期:
   LsyMerchantService.updateReviewStatusByMchNo 实测是 selectList(非 selectOne /
   非 LIMIT 1),0 行 ⇒ NOT_FOUND、>1 行 ⇒ AMBIGUOUS 且一行不写;用例
   onboardingNotify_duplicateMchNo_returnsFail(LsyOnboardingNotifyServiceTest:288)
   断言应答为 {"result_code":"FAIL","result_msg":"商户号命中多行,拒绝回写"}。
   ⇒ 只要那两行重复还在,mch_no='Y52211090004' 的审核通知每一条都得到 FAIL、
   上游会一直重推。去重是让这条路径通的第二个理由(第一个是建唯一索引)。

行尾:LF-only,改前 CR=0/LF=149、改后 CR=0/LF=169,未引入 CR。
alphaH 3 weeks ago
parent
commit
d35c901721
1 changed files with 19 additions and 0 deletions
  1. 19 0
      java/src/main/resources/db/lsy-merchant-mch-no-uk.sql

+ 19 - 0
java/src/main/resources/db/lsy-merchant-mch-no-uk.sql

@@ -122,6 +122,16 @@ SELECT conname, contype FROM pg_constraint
 --     description 自述:「租户级映射(Task5 Step1 端到端验证用)」
 --     ⇒ 它是 lsy-tenant-level.sql 落的**租户级映射行**(受 uk_lsy_merchant_tenant_level 约束,每租户至多一行)。
 --
+-- ★ 2026-09-23 补测:删任意一行都**不会**让别的表悬空 ——
+--   information_schema 里**没有任何外键**指向 pay_lsy_merchant;
+--   全库带 mch_no 列的表只有两张:pay_lsy_merchant(本表,2 行)与 pay_lsy_order(9 行引用该商户号)。
+--   pay_lsy_order 存的是**字符串 mch_no**、不是本表的 id ⇒ 去重后该商户号仍在,那 9 条订单照样解析得到。
+--
+-- ★ 推荐删**候选 A**(id=1):它的 description 是**数据自己写的处置说明**
+--   (「正式进件(子项目 B)后应删除」),而子项目 B 就是本批次、当前已完成;
+--   候选 B 没有这类自述,且它占着 tenant 2 的租户级槽位
+--   (受 uk_lsy_merchant_tenant_level = UNIQUE(tenant_id) WHERE enterprise_id IS NULL 约束)。
+--
 -- ★ 删任意一行都**不可逆**。先把下面两行原样跑一遍,确认要删的 id 之后再执行删除。
 --    SELECT * FROM pay_lsy_merchant WHERE id IN (1, 2102313081860202497);
 --
@@ -139,6 +149,15 @@ SELECT conname, contype FROM pg_constraint
 --     Task 6 当时**尚未实现**,那条查询与那个用例在仓库里**都不存在**。
 --     真话是:「**计划要求**它这么写,并且规定了用例 onboardingNotify_duplicateMchNo_returnsFail 去钉它」。
 --   ⇒ **免登录入口在无索引时也是安全的**(前提:那段代码照计划里的查询形状落地);索引是第二道闸,不是第一道。
+--   ★ 2026-09-23 追记(批次完工后复量):**那个前提已满足**。
+--     `LsyMerchantService.updateReviewStatusByMchNo` 实测就是 selectList(非 selectOne / 非 LIMIT 1),
+--     0 行 ⇒ NOT_FOUND、>1 行 ⇒ AMBIGUOUS 且**一行都不写**;
+--     用例 `onboardingNotify_duplicateMchNo_returnsFail`(LsyOnboardingNotifyServiceTest:288)
+--     断言应答正是 `{"result_code":"FAIL","result_msg":"商户号命中多行,拒绝回写"}`。
+--     ⇒ 上面那句「Task 6 当时尚未实现」现已过期(它描述的是写这段时的状态)。
+--   ★★ 而这条缺口**现在是活的、不是理论上的**:库里那两行重复还在,
+--     ⇒ mch_no='Y52211090004' 的审核通知**每一条都**得到 FAIL,上游会一直重推。
+--     去重之后这条路径才通。这是「删一行」除了建索引之外的第二个理由。
 --   (这条与**旧计划正文**「必须先补唯一约束再实现查询」相抵 —— 那句已在计划 Task 6 Step 0 里作废。)