1.0.529.verify.sql 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. -- ============================================================================
  2. -- 1.0.529 校验 · S5 IQC Inspection Detail · Batch 1 Persistence Foundation
  3. -- 约定:每条必须返回真值,否则 AutoVersionUpdate 判定该版本失败。
  4. -- 全部为纯 SELECT(runner 用 SqlQuerySingle 取首行首列,不支持 SET 变量)。
  5. --
  6. -- 覆盖 Batch 1 验收项 A/B/C/D/E/F:表存在 · 列逐项 · tenant-first 索引 · CHECK ·
  7. -- qms_* 未改 · 无业务数据写入
  8. -- ============================================================================
  9. -- ---- A1 · 两张新表都存在 ----
  10. SELECT COUNT(*) = 2 FROM information_schema.TABLES
  11. WHERE TABLE_SCHEMA = DATABASE()
  12. AND TABLE_NAME IN ('ado_s5_iqc_insp_bill_item', 'ado_s5_iqc_insp_bill_item_sample');
  13. -- ---- A2 · engine / collation 与仓库惯例一致 ----
  14. SELECT COUNT(*) = 2 FROM information_schema.TABLES
  15. WHERE TABLE_SCHEMA = DATABASE()
  16. AND TABLE_NAME IN ('ado_s5_iqc_insp_bill_item', 'ado_s5_iqc_insp_bill_item_sample')
  17. AND ENGINE = 'InnoDB' AND TABLE_COLLATION = 'utf8mb4_0900_ai_ci';
  18. -- ---- B1 · item 表列数 = 24 ----
  19. SELECT COUNT(*) = 24 FROM information_schema.COLUMNS
  20. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item';
  21. -- ---- B2 · sample 表列数 = 13 ----
  22. SELECT COUNT(*) = 13 FROM information_schema.COLUMNS
  23. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item_sample';
  24. -- ---- B3 · method_tool 必须是 varchar(1000)(源 jygjjyff 实测 538 字符,500 会截断) ----
  25. SELECT COUNT(*) = 1 FROM information_schema.COLUMNS
  26. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item'
  27. AND COLUMN_NAME = 'method_tool'
  28. AND DATA_TYPE = 'varchar' AND CHARACTER_MAXIMUM_LENGTH = 1000;
  29. -- ---- B4 · 其余快照列宽逐项 ----
  30. SELECT COUNT(*) = 7 FROM information_schema.COLUMNS
  31. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item'
  32. AND ((COLUMN_NAME = 'inspection_item' AND CHARACTER_MAXIMUM_LENGTH = 500)
  33. OR (COLUMN_NAME = 'inspection_standard' AND CHARACTER_MAXIMUM_LENGTH = 1000)
  34. OR (COLUMN_NAME = 'image_category' AND CHARACTER_MAXIMUM_LENGTH = 500)
  35. OR (COLUMN_NAME = 'sampling_scheme' AND CHARACTER_MAXIMUM_LENGTH = 500)
  36. OR (COLUMN_NAME = 'spec_remark' AND CHARACTER_MAXIMUM_LENGTH = 500)
  37. OR (COLUMN_NAME = 'upper_limit' AND CHARACTER_MAXIMUM_LENGTH = 50)
  38. OR (COLUMN_NAME = 'lower_limit' AND CHARACTER_MAXIMUM_LENGTH = 50));
  39. -- ---- B5 · item 表 NOT NULL 业务列恰好是这 4 个(id 由 PK 保证,不计入) ----
  40. SELECT COUNT(*) = 4 FROM information_schema.COLUMNS
  41. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item'
  42. AND IS_NULLABLE = 'NO'
  43. AND COLUMN_NAME IN ('tenant_id', 'inspection_bill_id', 'source_spec_id', 'source_spec_item_id');
  44. -- ---- B6 · seq 必须允许 NULL(源 qms_jygfzb.xh 实测 9 行为 NULL) ----
  45. SELECT COUNT(*) = 1 FROM information_schema.COLUMNS
  46. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item'
  47. AND COLUMN_NAME = 'seq' AND IS_NULLABLE = 'YES';
  48. -- ---- B7 · sample 表 NOT NULL 列 ----
  49. SELECT COUNT(*) = 5 FROM information_schema.COLUMNS
  50. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item_sample'
  51. AND IS_NULLABLE = 'NO'
  52. AND COLUMN_NAME IN ('tenant_id', 'inspection_bill_id', 'item_id', 'sample_index', 'sample_value_raw');
  53. -- ---- B8 · 两个 DECIMAL 真源列精度 = (18,6),与 ado_s5_iqc_sqe_disposition 惯例一致 ----
  54. SELECT COUNT(*) = 3 FROM information_schema.COLUMNS
  55. WHERE TABLE_SCHEMA = DATABASE()
  56. AND ((TABLE_NAME = 'ado_s5_iqc_insp_bill_item' AND COLUMN_NAME IN ('qualified_qty', 'unqualified_qty'))
  57. OR (TABLE_NAME = 'ado_s5_iqc_insp_bill_item_sample' AND COLUMN_NAME = 'sample_numeric'))
  58. AND NUMERIC_PRECISION = 18 AND NUMERIC_SCALE = 6;
  59. -- ---- C1 · tenant-first:所有非 PRIMARY 索引的首列必须是 tenant_id ----
  60. SELECT COUNT(*) = 0 FROM information_schema.STATISTICS
  61. WHERE TABLE_SCHEMA = DATABASE()
  62. AND TABLE_NAME IN ('ado_s5_iqc_insp_bill_item', 'ado_s5_iqc_insp_bill_item_sample')
  63. AND INDEX_NAME <> 'PRIMARY'
  64. AND SEQ_IN_INDEX = 1
  65. AND COLUMN_NAME <> 'tenant_id';
  66. -- ---- C2 · item UK 恰为 (tenant_id, inspection_bill_id, source_spec_item_id) ----
  67. SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) = 'tenant_id,inspection_bill_id,source_spec_item_id'
  68. FROM information_schema.STATISTICS
  69. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item'
  70. AND INDEX_NAME = 'uk_s5_iqc_item_scope' AND NON_UNIQUE = 0;
  71. -- ---- C3 · sample UK 恰为 (tenant_id, item_id, sample_index) ----
  72. SELECT GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) = 'tenant_id,item_id,sample_index'
  73. FROM information_schema.STATISTICS
  74. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'ado_s5_iqc_insp_bill_item_sample'
  75. AND INDEX_NAME = 'uk_s5_iqc_sample_scope' AND NON_UNIQUE = 0;
  76. -- ---- C4 · 两张表不得存在 FOREIGN KEY(实测 204 张 ado_* 表 FK 数 = 0) ----
  77. SELECT COUNT(*) = 0 FROM information_schema.TABLE_CONSTRAINTS
  78. WHERE CONSTRAINT_SCHEMA = DATABASE()
  79. AND TABLE_NAME IN ('ado_s5_iqc_insp_bill_item', 'ado_s5_iqc_insp_bill_item_sample')
  80. AND CONSTRAINT_TYPE = 'FOREIGN KEY';
  81. -- ---- D1 · 8 条 CHECK 约束齐备 ----
  82. SELECT COUNT(*) = 8 FROM information_schema.TABLE_CONSTRAINTS
  83. WHERE CONSTRAINT_SCHEMA = DATABASE()
  84. AND TABLE_NAME IN ('ado_s5_iqc_insp_bill_item', 'ado_s5_iqc_insp_bill_item_sample')
  85. AND CONSTRAINT_TYPE = 'CHECK'
  86. AND CONSTRAINT_NAME IN ('ck_s5_iqc_item_tenant', 'ck_s5_iqc_item_result_type',
  87. 'ck_s5_iqc_item_truth', 'ck_s5_iqc_item_judgement',
  88. 'ck_s5_iqc_item_jsrc',
  89. 'ck_s5_iqc_sample_tenant', 'ck_s5_iqc_sample_index',
  90. 'ck_s5_iqc_sample_judgement');
  91. -- ---- D2 · 两条 valid-tenant CHECK 确实排除 0 / 1 / 主租户哨兵 ----
  92. SELECT COUNT(*) = 2 FROM information_schema.CHECK_CONSTRAINTS
  93. WHERE CONSTRAINT_SCHEMA = DATABASE()
  94. AND CONSTRAINT_NAME IN ('ck_s5_iqc_item_tenant', 'ck_s5_iqc_sample_tenant')
  95. AND CHECK_CLAUSE LIKE '%1300000000001%'
  96. AND CHECK_CLAUSE LIKE '%is not null%';
  97. -- ---- D3 · 单一真源 CHECK 显式覆盖 NUMERIC 分支且不依赖三值逻辑隐式放行 ----
  98. SELECT COUNT(*) = 1 FROM information_schema.CHECK_CONSTRAINTS
  99. WHERE CONSTRAINT_SCHEMA = DATABASE()
  100. AND CONSTRAINT_NAME = 'ck_s5_iqc_item_truth'
  101. AND CHECK_CLAUSE LIKE '%result_type%is null%'
  102. AND CHECK_CLAUSE LIKE '%qualified_qty%';
  103. -- ---- E1 · qms_jygfzb 不得被新增 lrlx 列(本批对 qms_* 零 ALTER 的结构证明) ----
  104. SELECT COUNT(*) = 0 FROM information_schema.COLUMNS
  105. WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'qms_jygfzb' AND COLUMN_NAME = 'lrlx';
  106. -- ---- F1 · 本批完成时 item 表必须为空(零业务数据写入) ----
  107. SELECT COUNT(*) = 0 FROM ado_s5_iqc_insp_bill_item;
  108. -- ---- F2 · 本批完成时 sample 表必须为空 ----
  109. SELECT COUNT(*) = 0 FROM ado_s5_iqc_insp_bill_item_sample;