错误原因【-3236 此列列表已索引】

MySQL 允许同一列上创建多个单列索引;达梦 DM8 不允许:完全相同的列组合,不能建2个单列索引,不管索引名字是否不一样
你这个:
sql
CREATE INDEX "IDX_BILL_ORDER"
ON "UPS"."PAY_ORDER"("ORDER_CODE");
含义:在 UPS.PAY_ORDER 的 ORDER_CODE 单列建索引。 达梦目标库里面,ORDER_CODE 这一列已经存在一个单列索引了(可能是DTS已经迁移成功的另一个同名/不同名索引),再次创建就报 -3236
✅ 区分:单列索引 和 联合索引 共存是允许的,只有【完全一样的列集合】不能重复建索引。
第一步:先查询达梦目标库,看看这张表已有的索引
sql
SELECT INDEX_NAME,COLUMN_NAME
FROM DBA_IND_COLUMNS
WHERE TABLE_OWNER='UPS' AND TABLE_NAME='PAY_ORDER'
ORDER BY INDEX_NAME,COLUMN_POSITION;
执行后可以看到 PAY_ORDER 表所有索引和字段,确认 ORDER_CODE 已经有索引。
解决方案(3种方案,推荐方案1)
方案1:DTS迁移时,直接忽略这个报错(最常用)
-
索引已经存在,业务查询不受影响;
-
DTS只把表、数据迁移完成,重复索引报错直接跳过即可;
注意:迁移完成后核对索引列表,确认ORDER_CODE上至少保留1个索引满足业务查询需求。
方案2:源头MySQL预处理(推荐正式项目)
在源MySQL查看PAY_ORDER表索引:
sql
SHOW INDEX FROM PAY_ORDER;
发现 ORDER_CODE 存在多个单列索引,保留一个,多余的删掉:
ini
DROP INDEX 多余索引名 ON PAY_ORDER;
清理完重复单列索引,重新跑DTS迁移,就不会报-3236。
方案3:DTS任务设置【过滤重复索引】
新建/编辑DTS迁移任务,选择对象步骤:
- 选中
PAY_ORDER表,点【转换】 - 切换到索引页,手动取消勾选重复的索引IDX_BILL_ORDER,不让DTS迁移这个索引;
- 继续执行迁移。
补充小坑
- 达梦主键本身自带索引:如果
ORDER_CODE是主键,那主键索引已经存在,再建单列索引直接报-3236; - 联合索引:比如索引
idx_a(ORDER_CODE,STATUS),这个不影响单独建idx(ORDER_CODE)单列索引,不会报3236; - 大小写:达梦字典对象名大写,查询的时候
TABLE_OWNER='UPS'大写。
迁移完成后的校验SQL
sql
--查看UPS模式PAY_ORDER表所有索引定义
SELECT INDEX_NAME,INDEX_TYPE,UNIQUENESS FROM DBA_INDEXES WHERE OWNER='UPS' AND TABLE_NAME='PAY_ORDER';