提交
This commit is contained in:
1 parent
012a2ad68e
commit
5fe53c5481
4775 files changed
+2190111
-40277
No files matched your search
@@ -1,56 +0,0 @@
|
||||
-- 合同编号重复排查(只读,不改数据)
|
||||
-- 库:shanxia2.0 / crm_contract
|
||||
-- 用途:检查租户内 contract_no 是否仍有重复(含软删)
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 1) 按 (contract_no, tenant_no) 分组:任何重复(含软删)
|
||||
SELECT
|
||||
contract_no,
|
||||
tenant_no,
|
||||
COUNT(*) AS cnt,
|
||||
SUM(CASE WHEN del_flag = 0 THEN 1 ELSE 0 END) AS alive_cnt,
|
||||
SUM(CASE WHEN del_flag = 1 THEN 1 ELSE 0 END) AS deleted_cnt,
|
||||
GROUP_CONCAT(
|
||||
CONCAT(id, '/del', del_flag, '/', IFNULL(customer_name, ''))
|
||||
ORDER BY del_flag, create_time
|
||||
SEPARATOR ' | '
|
||||
) AS detail
|
||||
FROM crm_contract
|
||||
GROUP BY contract_no, tenant_no
|
||||
HAVING COUNT(*) > 1
|
||||
ORDER BY cnt DESC, contract_no;
|
||||
|
||||
-- 2) 仅有效单据 (del_flag=0) 是否撞号
|
||||
SELECT
|
||||
contract_no,
|
||||
tenant_no,
|
||||
COUNT(*) AS alive_cnt,
|
||||
GROUP_CONCAT(id ORDER BY create_time SEPARATOR ' | ') AS ids,
|
||||
GROUP_CONCAT(IFNULL(customer_name, '') ORDER BY create_time SEPARATOR ' | ') AS customers
|
||||
FROM crm_contract
|
||||
WHERE del_flag = 0
|
||||
GROUP BY contract_no, tenant_no
|
||||
HAVING COUNT(*) > 1
|
||||
ORDER BY alive_cnt DESC, contract_no;
|
||||
|
||||
-- 3) 指定编号示例:SX/X-JT20260803001(含改号后的 ~DEL~ 变体)
|
||||
SELECT
|
||||
id,
|
||||
contract_no,
|
||||
contract_name,
|
||||
customer_name,
|
||||
status,
|
||||
del_flag,
|
||||
create_time,
|
||||
update_time
|
||||
FROM crm_contract
|
||||
WHERE tenant_no = 'shanxia2.0'
|
||||
AND (
|
||||
contract_no = 'SX/X-JT20260803001'
|
||||
OR contract_no LIKE 'SX/X-JT20260803001~%'
|
||||
)
|
||||
ORDER BY del_flag, create_time;
|
||||
|
||||
-- 4) 当前唯一索引是否已是全局唯一版
|
||||
SHOW INDEX FROM crm_contract WHERE Key_name LIKE 'uk_contract%';
|
||||
@@ -1,77 +0,0 @@
|
||||
-- 合同编号租户内全局唯一(含软删不复用)— 可重复执行
|
||||
-- 1) 消解已有 (contract_no, tenant_no) 撞号:保留 del_flag=0,软删行改号
|
||||
-- 2) 唯一索引改为 (contract_no, tenant_no)
|
||||
--
|
||||
-- 说明:若生产已执行过,旧索引 uk_contract_tenant_no_del 可能已不存在,
|
||||
-- 本脚本会先检查再 DROP/ADD,避免 1091。
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 软删撞号改号:{原编号}~DEL~{id前8位}
|
||||
UPDATE crm_contract c
|
||||
INNER JOIN (
|
||||
SELECT contract_no, tenant_no
|
||||
FROM crm_contract
|
||||
GROUP BY contract_no, tenant_no
|
||||
HAVING COUNT(*) > 1
|
||||
) d ON c.contract_no = d.contract_no AND c.tenant_no = d.tenant_no
|
||||
SET c.contract_no = CONCAT(c.contract_no, '~DEL~', LEFT(c.id, 8)),
|
||||
c.update_time = NOW()
|
||||
WHERE c.del_flag = 1
|
||||
AND c.contract_no NOT LIKE '%~DEL~%'
|
||||
AND c.contract_no NOT LIKE '%~DUP~%';
|
||||
|
||||
-- 若仍有撞号(极端:两条都 del_flag=0),再改非 keep 的一条
|
||||
UPDATE crm_contract c
|
||||
INNER JOIN (
|
||||
SELECT contract_no, tenant_no, MIN(id) AS keep_id
|
||||
FROM crm_contract
|
||||
GROUP BY contract_no, tenant_no
|
||||
HAVING COUNT(*) > 1
|
||||
) d ON c.contract_no = d.contract_no AND c.tenant_no = d.tenant_no AND c.id <> d.keep_id
|
||||
SET c.contract_no = CONCAT(c.contract_no, '~DUP~', LEFT(c.id, 8)),
|
||||
c.update_time = NOW()
|
||||
WHERE c.contract_no NOT LIKE '%~DUP~%';
|
||||
|
||||
-- 有旧索引则删除
|
||||
SET @db := DATABASE();
|
||||
SET @sql := (
|
||||
SELECT IF(
|
||||
EXISTS(
|
||||
SELECT 1 FROM information_schema.statistics
|
||||
WHERE table_schema = @db
|
||||
AND table_name = 'crm_contract'
|
||||
AND index_name = 'uk_contract_tenant_no_del'
|
||||
),
|
||||
'ALTER TABLE crm_contract DROP INDEX `uk_contract_tenant_no_del`',
|
||||
'SELECT ''skip DROP uk_contract_tenant_no_del'' AS info'
|
||||
)
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 无新索引则添加
|
||||
SET @sql := (
|
||||
SELECT IF(
|
||||
EXISTS(
|
||||
SELECT 1 FROM information_schema.statistics
|
||||
WHERE table_schema = @db
|
||||
AND table_name = 'crm_contract'
|
||||
AND index_name = 'uk_contract_tenant_no'
|
||||
),
|
||||
'SELECT ''skip ADD uk_contract_tenant_no (already exists)'' AS info',
|
||||
'ALTER TABLE crm_contract ADD UNIQUE KEY `uk_contract_tenant_no` (`contract_no`, `tenant_no`)'
|
||||
)
|
||||
);
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 验收:应为空
|
||||
SELECT contract_no, tenant_no, COUNT(*) AS cnt
|
||||
FROM crm_contract
|
||||
GROUP BY contract_no, tenant_no
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
SHOW INDEX FROM crm_contract WHERE Key_name LIKE 'uk_contract%';
|
||||
Reference in new issue
Block a user