为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。 【DM版本】: DM8 【操作系统】:kylinv10 【CPU】: 【问题描述】*: [22000][-2109] 第1 行附近出现错误: 无效的约束名[INDEX33555693]
删除UNIQUE索引报错,尝试了官方文档的各种方法,依然无解
这个 INDEX33555693 可能是主键,你试着用下面这个SQL查一下,看能否找到索引对应的约束名以及约束类型,然后就可以 ALTER TABLE xxx DROP CONSTRAINT yyy 的方式来删除了。
WITH T_IDX AS ( SELECT USR.NAME AS USER_NAME --表宿主用户名 ,SCH.NAME AS SCHEMA_NAME --表所在模式名 ,TAB.NAME AS TABLE_NAME --表名 ,IDX.NAME AS INDEX_NAME --索引名 ,DECODE(IDXINFO.FLAG,1,'Y',9,'Y','N') AS GENERATED --是否为系统自动生成的索引 ,DECODE(IDXINFO.TYPE$,'BT','B 树','BM','位图','ST','空间','AR','数组') AS INDEX_TYPE --索引类型 ,RTRIM( DECODE(IDXINFO.FLAG & 0x01,0x00,'正常索引;') ||DECODE(IDXINFO.FLAG & 0x01,0x01,'系统索引;') ||DECODE(IDXINFO.FLAG & 0x02,0x02,'虚索引(VIRTUAL);') ||DECODE(IDXINFO.FLAG & 0x04,0x04,'主键;') ||DECODE(IDXINFO.FLAG & 0x08,0x08,'在临时表上;') ||DECODE(IDXINFO.FLAG & 0x10,0x10,'无效索引;') ||DECODE(IDXINFO.FLAG & 0x20,0x20,'fast pool;') ||DECODE(IDXINFO.XTYPE & 0x01,0x00,CASE WHEN (TAB.INFO3 & 0x3F) IN (0x13, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27) THEN 'HUGE表聚集索引(HUGE CLUSTER);' ELSE '聚集索引(CLUSTER);' END) ||DECODE(IDXINFO.XTYPE & 0x01,0x01,'二级索引;') ||DECODE(IDXINFO.XTYPE & 0x02,0x02,'函数索引(FUNCTION-BASED NORMAL);') ||DECODE(IDXINFO.XTYPE & 0x04,0x04,'全局索引在水平分区子表上;') ||DECODE(IDXINFO.XTYPE & 0x08,0x08,'全局索引在水平分区主表上;') ||DECODE(IDXINFO.XTYPE & 0x10,0x10,'唯一索引;') ||DECODE(IDXINFO.XTYPE & 0x20,0x20,'扁平索引(FLAT);') ||DECODE(IDXINFO.XTYPE & 0x40,0x40,'数组索引;') ||DECODE(IDXINFO.XTYPE & 0x800,0x800,'该位图索引是由改造后创建;') ||DECODE(IDXINFO.XTYPE & 0x1000,0x1000,'位图索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x2000,0x2000,'位图连接索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x4000,0x4000,'位图连接索引虚索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x8000,0x8000,'空间索引;') ||DECODE(IDXINFO.XTYPE & 0x10000,0x00,'','索引不可见;') ,';') AS INDEX_EXTINFO --索引扩展属性 ,DECODE(IDX.VALID,'Y','USABLE','UNUSABLE') AS INDEX_STATUS --索引可用状态 ,DECODE(IDXINFO.ISUNIQUE,'Y','UNIQUE','NONUNIQUE') AS UNIQUENESS --是否唯一索引 ,CONS.NAME AS CONSTRAINT_NAME --索引关联约束名称 ,DECODE(CONSINFO.TYPE$,'P','主键约束','U','唯一性约束','F','引用约束','C','检查约束') AS CONSTRAINT_TYPE --索引关联约束类别 ,CASE WHEN IDXINFO.KEYNUM = 0 AND IDXINFO.FLAG & 0x01 = 0x01 AND IDXINFO.XTYPE & 0x01 = 0x00 THEN 'ROWID' ELSE DECODE(IDXINFO.XTYPE & 0x02,0x02,REPLACE(FBI_DEF(IDX.ID),' ',' DESC') ,(SELECT LISTAGG(COL.NAME || DECODE(SF_GET_INDEX_KEY_ORDER(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID),'D',' DESC'),',') WITHIN GROUP (ORDER BY SF_GET_INDEX_KEY_SEQ(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID)) FROM SYSCOLUMNS COL WHERE COL.ID = TAB.ID AND SF_COL_IS_IDX_KEY(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID) = 1 ) ) END AS INDEX_COLS --索引字段列表 ,CASE WHEN CONSINFO.TYPE$ = 'F' THEN REFDEF(IDX.ID,1) WHEN CONS.ID IS NOT NULL THEN CONSDEF(IDX.ID,1) ELSE INDEXDEF(IDX.ID,1) END AS INDEX_DDL --索引创建用DDL语句 FROM DUAL LEFT JOIN SYSOBJECTS TAB ON TAB.TYPE$ = 'SCHOBJ' AND TAB.SUBTYPE$ IN ('STAB','UTAB') LEFT JOIN SYSOBJECTS SCH ON SCH.TYPE$ = 'SCH' AND SCH.ID = TAB.SCHID LEFT JOIN SYSOBJECTS USR ON USR.TYPE$ = 'UR' AND USR.SUBTYPE$ = 'USER' AND USR.ID = SCH.PID LEFT JOIN SYSOBJECTS IDX ON IDX.TYPE$ = 'TABOBJ' AND IDX.SUBTYPE$ = 'INDEX' AND IDX.PID = TAB.ID LEFT JOIN SYSINDEXES IDXINFO ON IDX.ID = IDXINFO.ID LEFT JOIN SYSCONS CONSINFO ON CONSINFO.INDEXID = IDXINFO.ID AND CONSINFO.TABLEID = IDX.PID LEFT JOIN SYSOBJECTS CONS ON CONS.TYPE$ = 'TABOBJ' AND CONS.SUBTYPE$ = 'CONS' AND CONS.ID = CONSINFO.ID LEFT JOIN SYSOBJECTS PAR ON PAR.TYPE$ = 'TABOBJ' AND PAR.SUBTYPE$ = 'INDEX' AND PAR.ID = IDX.INFO4 LEFT JOIN V$TABLESPACE TS ON TS.ID = IDXINFO.GROUPID LEFT JOIN V$HUGE_TABLESPACE HTS ON HTS.ID = IDXINFO.GROUPID ) SELECT * FROM T_IDX WHERE INDEX_NAME = 'INDEX33555693'
这个 INDEX33555693 可能是主键,你试着用下面这个SQL查一下,看能否找到索引对应的约束名以及约束类型,然后就可以 ALTER TABLE xxx DROP CONSTRAINT yyy 的方式来删除了。
WITH T_IDX AS ( SELECT USR.NAME AS USER_NAME --表宿主用户名 ,SCH.NAME AS SCHEMA_NAME --表所在模式名 ,TAB.NAME AS TABLE_NAME --表名 ,IDX.NAME AS INDEX_NAME --索引名 ,DECODE(IDXINFO.FLAG,1,'Y',9,'Y','N') AS GENERATED --是否为系统自动生成的索引 ,DECODE(IDXINFO.TYPE$,'BT','B 树','BM','位图','ST','空间','AR','数组') AS INDEX_TYPE --索引类型 ,RTRIM( DECODE(IDXINFO.FLAG & 0x01,0x00,'正常索引;') ||DECODE(IDXINFO.FLAG & 0x01,0x01,'系统索引;') ||DECODE(IDXINFO.FLAG & 0x02,0x02,'虚索引(VIRTUAL);') ||DECODE(IDXINFO.FLAG & 0x04,0x04,'主键;') ||DECODE(IDXINFO.FLAG & 0x08,0x08,'在临时表上;') ||DECODE(IDXINFO.FLAG & 0x10,0x10,'无效索引;') ||DECODE(IDXINFO.FLAG & 0x20,0x20,'fast pool;') ||DECODE(IDXINFO.XTYPE & 0x01,0x00,CASE WHEN (TAB.INFO3 & 0x3F) IN (0x13, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27) THEN 'HUGE表聚集索引(HUGE CLUSTER);' ELSE '聚集索引(CLUSTER);' END) ||DECODE(IDXINFO.XTYPE & 0x01,0x01,'二级索引;') ||DECODE(IDXINFO.XTYPE & 0x02,0x02,'函数索引(FUNCTION-BASED NORMAL);') ||DECODE(IDXINFO.XTYPE & 0x04,0x04,'全局索引在水平分区子表上;') ||DECODE(IDXINFO.XTYPE & 0x08,0x08,'全局索引在水平分区主表上;') ||DECODE(IDXINFO.XTYPE & 0x10,0x10,'唯一索引;') ||DECODE(IDXINFO.XTYPE & 0x20,0x20,'扁平索引(FLAT);') ||DECODE(IDXINFO.XTYPE & 0x40,0x40,'数组索引;') ||DECODE(IDXINFO.XTYPE & 0x800,0x800,'该位图索引是由改造后创建;') ||DECODE(IDXINFO.XTYPE & 0x1000,0x1000,'位图索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x2000,0x2000,'位图连接索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x4000,0x4000,'位图连接索引虚索引(BITMAP);') ||DECODE(IDXINFO.XTYPE & 0x8000,0x8000,'空间索引;') ||DECODE(IDXINFO.XTYPE & 0x10000,0x00,'','索引不可见;') ,';') AS INDEX_EXTINFO --索引扩展属性 ,DECODE(IDX.VALID,'Y','USABLE','UNUSABLE') AS INDEX_STATUS --索引可用状态 ,DECODE(IDXINFO.ISUNIQUE,'Y','UNIQUE','NONUNIQUE') AS UNIQUENESS --是否唯一索引 ,CONS.NAME AS CONSTRAINT_NAME --索引关联约束名称 ,DECODE(CONSINFO.TYPE$,'P','主键约束','U','唯一性约束','F','引用约束','C','检查约束') AS CONSTRAINT_TYPE --索引关联约束类别 ,CASE WHEN IDXINFO.KEYNUM = 0 AND IDXINFO.FLAG & 0x01 = 0x01 AND IDXINFO.XTYPE & 0x01 = 0x00 THEN 'ROWID' ELSE DECODE(IDXINFO.XTYPE & 0x02,0x02,REPLACE(FBI_DEF(IDX.ID),' ',' DESC') ,(SELECT LISTAGG(COL.NAME || DECODE(SF_GET_INDEX_KEY_ORDER(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID),'D',' DESC'),',') WITHIN GROUP (ORDER BY SF_GET_INDEX_KEY_SEQ(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID)) FROM SYSCOLUMNS COL WHERE COL.ID = TAB.ID AND SF_COL_IS_IDX_KEY(IDXINFO.KEYNUM, IDXINFO.KEYINFO, COL.COLID) = 1 ) ) END AS INDEX_COLS --索引字段列表 ,CASE WHEN CONSINFO.TYPE$ = 'F' THEN REFDEF(IDX.ID,1) WHEN CONS.ID IS NOT NULL THEN CONSDEF(IDX.ID,1) ELSE INDEXDEF(IDX.ID,1) END AS INDEX_DDL --索引创建用DDL语句 FROM DUAL LEFT JOIN SYSOBJECTS TAB ON TAB.TYPE$ = 'SCHOBJ' AND TAB.SUBTYPE$ IN ('STAB','UTAB') LEFT JOIN SYSOBJECTS SCH ON SCH.TYPE$ = 'SCH' AND SCH.ID = TAB.SCHID LEFT JOIN SYSOBJECTS USR ON USR.TYPE$ = 'UR' AND USR.SUBTYPE$ = 'USER' AND USR.ID = SCH.PID LEFT JOIN SYSOBJECTS IDX ON IDX.TYPE$ = 'TABOBJ' AND IDX.SUBTYPE$ = 'INDEX' AND IDX.PID = TAB.ID LEFT JOIN SYSINDEXES IDXINFO ON IDX.ID = IDXINFO.ID LEFT JOIN SYSCONS CONSINFO ON CONSINFO.INDEXID = IDXINFO.ID AND CONSINFO.TABLEID = IDX.PID LEFT JOIN SYSOBJECTS CONS ON CONS.TYPE$ = 'TABOBJ' AND CONS.SUBTYPE$ = 'CONS' AND CONS.ID = CONSINFO.ID LEFT JOIN SYSOBJECTS PAR ON PAR.TYPE$ = 'TABOBJ' AND PAR.SUBTYPE$ = 'INDEX' AND PAR.ID = IDX.INFO4 LEFT JOIN V$TABLESPACE TS ON TS.ID = IDXINFO.GROUPID LEFT JOIN V$HUGE_TABLESPACE HTS ON HTS.ID = IDXINFO.GROUPID ) SELECT * FROM T_IDX WHERE INDEX_NAME = 'INDEX33555693'