2026-10-10-presign-convert-unique.sql 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. -- 预签约订单转正式协议唯一约束
  2. -- MySQL 5.7;重复执行安全。历史重复或错误同名索引会给出明确修复提示。
  3. SET NAMES utf8mb4;
  4. DELIMITER $$
  5. DROP PROCEDURE IF EXISTS `ensure_presign_convert_unique`$$
  6. CREATE PROCEDURE `ensure_presign_convert_unique`()
  7. BEGIN
  8. DECLARE duplicate_sources INT DEFAULT 0;
  9. DECLARE idx_entries INT DEFAULT 0;
  10. DECLARE idx_non_unique INT DEFAULT 1;
  11. DECLARE idx_columns VARCHAR(512) DEFAULT '';
  12. SELECT COUNT(*) INTO duplicate_sources
  13. FROM (
  14. SELECT `tenant_no`, `source_presign_order_id`
  15. FROM `biz_collection_protocol`
  16. WHERE `source_presign_order_id` IS NOT NULL
  17. AND `source_presign_order_id` <> ''
  18. GROUP BY `tenant_no`, `source_presign_order_id`
  19. HAVING COUNT(*) > 1
  20. ) duplicate_rows;
  21. IF duplicate_sources > 0 THEN
  22. SIGNAL SQLSTATE '45000'
  23. SET MESSAGE_TEXT = 'duplicate presign conversions found; remediation: reconcile duplicate formal protocols before rerunning migration';
  24. END IF;
  25. SELECT
  26. COUNT(*),
  27. COALESCE(MIN(NON_UNIQUE), 1),
  28. COALESCE(GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX SEPARATOR ','), '')
  29. INTO idx_entries, idx_non_unique, idx_columns
  30. FROM information_schema.STATISTICS
  31. WHERE TABLE_SCHEMA = DATABASE()
  32. AND TABLE_NAME = 'biz_collection_protocol'
  33. AND INDEX_NAME = 'uk_collection_protocol_presign_source';
  34. IF idx_entries = 0 THEN
  35. ALTER TABLE `biz_collection_protocol`
  36. ADD UNIQUE INDEX `uk_collection_protocol_presign_source`
  37. (`tenant_no`, `source_presign_order_id`);
  38. ELSEIF idx_entries <> 2
  39. OR idx_non_unique <> 0
  40. OR idx_columns <> 'tenant_no,source_presign_order_id' THEN
  41. SIGNAL SQLSTATE '45000'
  42. SET MESSAGE_TEXT = 'wrong index uk_collection_protocol_presign_source; remediation: drop or rename it, then rerun migration';
  43. END IF;
  44. END$$
  45. CALL `ensure_presign_convert_unique`()$$
  46. DROP PROCEDURE `ensure_presign_convert_unique`$$
  47. DELIMITER ;