达梦 DTS 迁移 MySQL 报错 - 3236:此列列表已索引 解决方案

错误原因【-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迁移任务,选择对象步骤:

  1. 选中 PAY_ORDER 表,点【转换】
  2. 切换到索引页,手动取消勾选重复的索引IDX_BILL_ORDER,不让DTS迁移这个索引;
  3. 继续执行迁移。

补充小坑

  1. 达梦主键本身自带索引:如果ORDER_CODE是主键,那主键索引已经存在,再建单列索引直接报-3236;
  2. 联合索引:比如索引idx_a(ORDER_CODE,STATUS),这个不影响单独建idx(ORDER_CODE)单列索引,不会报3236;
  3. 大小写:达梦字典对象名大写,查询的时候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';
相关推荐
我是大猴子4 小时前
redis
数据库·redis·缓存
陈随易5 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
卷无止境6 小时前
RAGFlow 项目全景报告:从文档解析引擎到 Agent 原生数据库
后端·python
苏宸啊6 小时前
MySQL(一)
数据库·mysql
2603_969694856 小时前
JDBC 基础学习笔记:API 核心原理解析与 CRUD 代码实操
数据库·笔记·mysql·学习方法·database·sql注入
小Z先生6 小时前
我用 Go + 系统 WebView 写了个纯本地 Postman:不装 Electron、不连云端
后端·github
这个DBA有点耶7 小时前
库内语义构建 vs 外挂向量库:业务语义缺失,才是RAG“胡说八道”的根源
数据库·mysql·aigc
IT_陈寒7 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
灿飞屋7 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
石小石Orz7 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法