达梦数据库索引删除操作小记

目录

问题背景

数据库类型:达梦

数据库版本:dm8

起因:在某个版本表中设置了主键,因为业务调整, 需要删除该主键处的索引

操作:在达梦数据库中查询索引名称并执行

sql 复制代码
DROP INDEX DATA_DAG.INDEX33557221;

报错:

txt 复制代码
SQL 错误 [22000]: 第2 行附近出现错误:
试图删除系统索引[INDEX33557221]

异常分析

异常原因

在达梦数据库中,当你为表创建 主键(PRIMARY KEY) 或 唯一约束(UNIQUE) 时,数据库系统会自动在后台创建一个同名的、或者以"INDEX"+数字命名的唯一索引来物理地保证数据的唯一性。

用户创建的索引:名称通常由用户自定义,如 IDX_CUSTOMER_NAME。

系统创建的索引:名称通常是自动生成的数字序列,比如 INDEX33557221。这个索引是某个表约束(主键或唯一约束)的物理实现。

达梦数据库中创建约束时,会自动创建索引以实现其约束需求:

text 复制代码
约束(逻辑概念) ← 绑定 → 索引(物理实现)
    ↑                             ↑
逻辑完整性保证              物理存储结构

在删除索引时,因为索引是为约束自动创建的,如果删除索引,约束无法保证唯一性。为了不让逻辑约束失效,系统阻止这一操作。

约束与索引的同步性:

text 复制代码
创建约束 → 自动创建索引 → 二者绑定
               ↓
           删除约束 → 自动删除索引(级联删除)
               ↓
           想删除索引? → 必须通过删除约束

解决方案

目标不是处理该索引,而是确定创建该索引的约束,并处理该约束

sql 复制代码
SELECT 
    a.OWNER AS 模式名,
    a.TABLE_NAME AS 表名,
    a.INDEX_NAME AS 索引名,
    a.UNIQUENESS AS 是否唯一,
    b.CONSTRAINT_NAME AS 约束名,
    b.CONSTRAINT_TYPE AS 约束类型
FROM ALL_INDEXES a
LEFT JOIN ALL_CONSTRAINTS b ON (a.OWNER = b.OWNER 
                                 AND a.INDEX_NAME = b.INDEX_NAME 
                                 AND a.TABLE_NAME = b.TABLE_NAME)
WHERE a.TABLE_NAME = 'asset_permit_history'
  AND a.OWNER = 'DATA_DAG'; 

关键字段解释:

  • CONSTRAINT_NAME: 关联的约束名称(例如 PK_EMPLOYEE)。
  • CONSTRAINT_TYPE:
    • P: 主键约束(Primary Key)
    • U: 唯一约束(Unique)

删除约束:

sql 复制代码
ALTER TABLE <模式名>.<表名> DROP CONSTRAINT <约束名>;

主键约束与唯一约束的区别:

方面 主键约束(P) 唯一约束(U)
语法形式 相同 相同
业务重要性 关键基础设施 业务规则约束
依赖关系 可能被多个外键引用 较少被引用
删除风险 高风险,需维护窗口 中低风险,可灵活安排
恢复必要性 必须立即重建 可选重建
影响范围 整个表及关联表 特定列
数据影响 破坏行唯一标识 允许列重复值

总结

操作流程检查表:

text 复制代码
[遇到系统索引 INDEXXXXXX]
       ↓
[查询关联约束] → ALL_CONSTRAINTS.INDEX_NAME = 'INDEXXXXXX'
       ↓
[分析约束类型] → P(主键) / U(唯一) / 其他
       ↓
[评估业务影响] → 删除后数据还能保持一致性吗?
       ↓
[检查依赖关系] → 是否有外键引用?
       ↓
[选择正确操作] → 删除约束 / 重建约束 / 其他
       ↓
[执行并验证] → 确认索引随约束正确变化

关键原则:

总是先查约束,再看索引

通过约束管理索引,而不是直接操作索引

理解业务需求:是要改规则(约束)还是改实现(索引)?

系统索引是数据库的"内部实现",用户应该通过公开接口(约束)操作


系统索引是约束的"影子",它存在的唯一意义就是为约束服务。处理影子本身没有意义(也不允许),必须处理产生影子的本体------约束。

相关推荐
小陈工2 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希7 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神7 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员7 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java8 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿8 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴8 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存