Forráskód Böngészése

fix(sql): avoid UUID collision in plan-archive price role backfill

MySQL may evaluate UUID() once per INSERT...SELECT, causing duplicate
primary keys when backfilling multiple sys_role_menu rows.

Co-authored-by: Cursor <cursoragent@cursor.com>
zlwu 2 hónapja
szülő
commit
6bf4e7b249

+ 6 - 2
docs/sql/migrations/2026-09-03-pl-plan-archive-price-perm.sql

@@ -1,5 +1,9 @@
 -- 运输计划归档:查看单价金额按钮权限
 -- 设计: docs/superpowers/specs/2026-09-03-pl-plan-archive-price-permission-design.md
+--
+-- 注意:sys_role_menu.id 勿用 REPLACE(UUID(),'-','') 做多行 INSERT…SELECT。
+-- MySQL 5.7 下 UUID() 在同一次 SELECT 中可能只算一次,导致 PRIMARY 冲突(1062)。
+-- 改用按行确定性 MD5(role_id + menu + 源行 id)。
 
 SET NAMES utf8mb4;
 
@@ -23,7 +27,7 @@ INSERT INTO `sys_role_menu` (
   `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
 )
 SELECT
-  REPLACE(UUID(), '-', ''),
+  MD5(CONCAT(rm.role_id, '|PL_PLAN_ARCHIVE_PRICE|parent|', rm.id)),
   rm.role_id,
   'PL_PLAN_ARCHIVE_PRICE',
   rm.tenant_no,
@@ -51,7 +55,7 @@ INSERT INTO `sys_role_menu` (
   `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
 )
 SELECT
-  REPLACE(UUID(), '-', ''),
+  MD5(CONCAT(rm.role_id, '|PL_PLAN_ARCHIVE_PRICE|archive|', rm.id)),
   rm.role_id,
   'PL_PLAN_ARCHIVE_PRICE',
   rm.tenant_no,