`
kingxss
  • 浏览: 973894 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle修改字段类型后索引错误的解决方案

阅读更多

起因:

     由于在查询中需要用到 UNION ALL 操作,而表中的存在 LONG 类型字段,操作无法完成,根据具体业务场景,将 LONG 类型字段修改为 CLOB 类型。修改后,UNION ALL 操作可行,但是子表的增删改操作出现了问题,提示为父表的 INDEX 不可用。

 

   这里顺便说一句:如果要从VARCHAR2类型修改为特殊类型CLOB,那么不能直接从VARCHAR2转换为CLOB,需要使用LONG类型,来做一个过渡(可以先修改为LONG类型,然后从LONG修改为CLOB)。

 

解决方案:

 

1.同事前不久也遇到了这个问题,他的解决方案是:备份旧的表,删除表,然后再导入数据,并且依然需要重建主键等。对没有直接操作权限的ORCALE服务器恐怕有难度。所以这里归根结底还是drop and re-create。

 

2.重建索引。Oracle重建索引有多种方式,如 drop and re-create、rebuild、rebuild online等。这里采用的是第一种方式删除创建。需要的一些脚本如下(TB_SCENERY是父表【景点表】,TB_SCENERY_TICKETS是子表【景点门票表】):

--查询主外键,表名一定要大写
select constraint_name from user_constraints where table_name = 'TB_SCENERY';
select constraint_name from user_constraints where table_name = 'TB_SCENERY_TICKETS';

--删除主外键,注意大小写
alter table TB_SCENERY drop constraint SCENERY_PK_ID;
alter table TB_SCENERY_TICKETS drop constraint SCENERY_ID;

--增加主键(增加主键时会自动建立关于主键的索引)
alter table TB_SCENERY add constraint SCENERY_PK_ID primary key (ID) ; 

--增加外键
alter table TB_SCENERY_TICKETS add constraint SCENERY_PK_ID foreign key (SCENERY_ID)  references TB_SCENERY (ID);

--查询表的相关索引
select index_name,index_type,table_name from user_indexes where table_name='TB_SCENERY';

--删除索引[强制]
DROP INDEX SCENERY_PK_ID [FORCE];

--查询哪些表没有建立索引
SELECT table_name FROM User_tables t  WHERE NOT EXISTS (SELECT table_name FROM User_constraints c WHERE constraint_type = 'P' AND t.table_name=c.table_name)

 这里的步骤是:

1.查询子表的外键名称,删除对应的外键,以及外键对应的索引

2.查询主表的主键名称,删除对应的主键,以及主键对应的索引

3.建立主表主键(主键索引会自动建立),建立子表外键,建立外键索引

 

3.drop and re-create 方式的有点是速度快,缺点是会影响原有的SQL查询,如果考虑这个影响那就可以采用rebuild的方式(IDX_TEST_C1这是索引名称):

ALTER INDEX IDX_TEST_C1 REBUILD; 

 

 

 其实开始是尝试的是rebuild的方式,但是失败了,无可奈何只能采用drop and re-create 方式。

 

分享到:
评论

相关推荐

    Oracle 增加修改删除字段

    如果修改后的数据类型与原有数据不兼容,可能需要先将表中的相关数据清空或修改成新类型的兼容格式。 #### 三、删除字段 删除字段的语法非常简单: ```sql ALTER TABLE 表名 DROP (字段名); ``` **示例**:删除`...

    关于oracle clob 类型字段重建索引SQL及修复用户表空间索引空间的存储过程

    以下是一个简单的重建CLOB类型字段索引的SQL语句示例: ```sql BEGIN EXECUTE IMMEDIATE 'DROP INDEX your_clob_index_name'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END; / ...

    oracle不走索引可能原因.docx

    4. **隐式类型转换**: 当索引列的数据类型与查询条件中的数据类型不匹配时,Oracle会进行隐式类型转换。例如,一个字符类型的列与整数进行比较时,会导致Oracle不使用索引。这种情况下,可以避免类型转换,或者确保...

    ORACLE中CLOB字段转String类型

    ### ORACLE中CLOB字段转String类型 在Oracle数据库中,`CLOB`(Character Large Object)是一种用于存储大量文本数据的数据类型。由于其能够存储非常大的文本块(最大可达4GB),因此常被用于存储文章、报告或任何...

    oracle约束和索引笔记

    Oracle支持多种类型的索引: - **B树索引(B-Tree Index)**: 最常见的索引类型,适用于等值查询,根据索引键的排序顺序查找数据。 - **位图索引(Bitmap Index)**: 适合于在含有大量重复值的列上,尤其是在进行...

    数据库 创建索引 sql oracle

    索引的优化包括选择正确的索引类型、选择正确的索引字段、优化索引的填充因子、优化索引的 Statistics 等。 创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。但是,索引的创建和管理需要遵循一定的...

    oracle创建表创建唯一索引

    在Oracle数据库管理系统中,创建表和唯一索引是数据库设计中的关键步骤,它们对于数据的组织、查询效率和数据完整性至关重要。以下将详细介绍如何创建学员信息表,创建唯一索引,以及如何修改表来添加主键和检查约束...

    oracle 索引类型

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的索引类型以优化查询性能。索引是数据库中的关键元素,它们能够加速对数据表中特定记录的查找。本篇将深入探讨Oracle中的主要索引类型,以及它们的...

    oracle 全文检索 全文索引 多列字段索引

    oracle 全文检索 oracle全文索引 多列字段检索,匹配多列字段搜索功能。

    Oracle在线建立超大表的索引

    #### 索引字段与类型 - **字段**:PARENT_CUSTOMER_NO(集团相关客户才有值,超过90%的字段值为空) - **索引类型**:GLOBAL B-Tree #### Oracle创建索引涉及的主要I/O操作 为了理解如何优化创建索引的过程,首先...

    [Oracle]如何在亿级记录表中创建索引

    2. **评估索引类型**:根据表的特性决定是创建B树索引还是其他类型的索引(如位图索引)。 3. **分批创建索引**:对于大型表,可以考虑先创建部分索引,然后逐步添加更多的索引以避免一次性创建所有索引带来的性能...

    Oracle数据库表建立字段唯一性的方法

    综上所述,Oracle数据库提供了多种确保字段唯一性的方法,包括唯一约束和唯一索引,它们在确保数据完整性、提高查询效率以及处理重复值方面都有各自的特点和适用场景。开发者可以根据具体需求和性能考虑选择合适的...

    Oracle为sdo_geometry创建空间索引

    空间索引是 Oracle 中的一种特殊索引类型,用于加速空间数据的查询和检索。空间索引可以大大提高空间数据的查询效率,特别是在处理大量空间数据时。本文将详细介绍如何在 Oracle 中创建空间索引,包括创建空间索引的...

    在OracleE数据库的字段上建立索引的方法

    总的来说,对于在`WHERE`子句中使用函数的情况,我们可以通过对查询语句的适当修改,创建出能够与索引配合的条件,从而在不牺牲查询性能的前提下,实现对数据库字段的高效检索。这种技术在处理含有大量数据的表时...

    Oracle如何对CLOB行字段来执行全文检索

    Oracle 数据库中,CLOB 行字段是一种常用的数据类型,用于存储大文本数据。然而,在 Oracle8i 版本之前,对大字段 CLOB 仍然不支持在 where 子句直接的 Like 操作。这使得开发者无法直接对 CLOB 字段中的内容进行 ...

    oracle-字段类型.pdf

    在Oracle数据库中,字段类型是定义表结构的关键部分,它决定了数据的存储方式和容量。以下是对Oracle中一些主要字段类型的详细说明: 1. **CHAR**:这是一个固定长度的字符串类型,最大长度为2000字节。无论实际...

    oracle中索引的使用

    函数索引允许在列上应用函数后再创建索引,如对日期字段进行年份提取后建索引。唯一索引则确保索引列中的每个值都是唯一的,有助于维护数据的完整性。 创建索引有多种方式,如通过CREATE INDEX语句直接创建,或在...

    oracle实现多字段匹配一个关键字查询(本人亲测,没毛病)

    ### Oracle实现多字段匹配一个关键字查询 在Oracle数据库中,有时我们需要从多个字段中搜索包含特定关键字的数据。这种需求在很多场景下都非常常见,比如在CRM系统中搜索客户信息、在文档管理系统中查找文档等。...

    oracle实现多字段匹配一个关键字查询

    在Oracle数据库中,有时我们需要对多个字段进行联合搜索,即多字段匹配一个关键字查询。本文将详细介绍两种在Oracle中实现这种查询的方法。 ### 一、使用管道符号(||)连接字段 这种方法通过使用Oracle中的字符串...

Global site tag (gtag.js) - Google Analytics