`

不删除Oracle中数据的情况下,改字段类型

 
阅读更多
http://blog.csdn.net/yiqijinbu/article/details/7414951

--修改INFO_CUS_COMPLEX_TAX序号类型
alter table INFO_CUS_COMPLEX_TAX  add AA number;
-- Add/modify columns
alter table  INFO_CUS_COMPLEX_TAX  modify NO null;
--禁用约束
alter table INFO_CUS_COMPLEX_TAX disable constraint PK_INFO_COMPLEX_TAX1;
update  INFO_CUS_COMPLEX_TAX  set AA=NO,NO=null;
commit;
alter table  INFO_CUS_COMPLEX_TAX  modify NO number(4);
update  INFO_CUS_COMPLEX_TAX  set NO=AA,AA=null;
commit;
alter table  INFO_CUS_COMPLEX_TAX  drop column AA;
alter table  INFO_CUS_COMPLEX_TAX  modify NO not null;
--启用约束

alter table INFO_CUS_COMPLEX_TAX enable constraint PK_INFO_COMPLEX_TAX1;

问题:发现数据库出现当约束禁用/删除后,与它对应的索引并没有被删除,导致在将NO列的值赋给AA列时依然报违反唯一约束

正常情况:当约束被禁用/删除后,与它对应的索引应该会被删掉,当约束被启用/创建时,再重新创建

可能的原因:

在创建约束的时候,Oracle会自动创建对应的索引,这两者是关联的,当约束被禁用/删除时,对应的索引会被删掉,当启用/创建时,对应的索引会被创建,但是如果先建索引后建约束,即使两者的名字,关联字段一致他们也是没有关系的,看上去和上面一样,这时就会出现上面的问题。

解决办法1:判断那个索引是否存在

脚本:

declare
V_Count varchar2(2);
begin
--修改INFO_CUS_COMPLEX_TAX序号类型
execute immediate 'alter table INFO_CUS_COMPLEX_TAX  add AA number';
-- Add/modify columns
execute immediate 'alter table  INFO_CUS_COMPLEX_TAX  modify NO null';
--禁用约束
execute immediate 'alter table INFO_CUS_COMPLEX_TAX disable constraint PK_INFO_COMPLEX_TAX1';


select count(t.status) into V_Count from user_indexes t where t.index_name='PK_INFO_COMPLEX_TAX1';
if (V_Count>0) then
   execute immediate 'drop index PK_INFO_COMPLEX_TAX1';
end if;

execute immediate 'update  INFO_CUS_COMPLEX_TAX  set AA=NO,NO=null';
execute immediate 'alter table  INFO_CUS_COMPLEX_TAX  modify NO number(4)';


execute immediate 'update  INFO_CUS_COMPLEX_TAX  set NO=AA,AA=null';
commit;
execute immediate 'alter table  INFO_CUS_COMPLEX_TAX  drop column AA';
execute immediate 'alter table  INFO_CUS_COMPLEX_TAX  modify NO not null';
--启用约束
execute immediate 'alter table INFO_CUS_COMPLEX_TAX enable constraint PK_INFO_COMPLEX_TAX1';


end;

解决方案2:采用级联删除
alter table tvehicle drop constraint CHECK_ONLY cascade drop index;
再重新创建索引


分享到:
评论

相关推荐

    Oracle 增加修改删除字段

    在Oracle数据库中,我们经常需要对现有的表结构进行调整,比如增加新的字段、修改现有字段的属性或数据类型、删除不再使用的字段等。这些操作可以通过`ALTER TABLE`命令来完成。本文将详细介绍如何使用`ALTER TABLE`...

    oracle数据库中的对表中字段的增删改查

    在Oracle数据库中,对表中字段的增删改查是数据库管理的基础操作,涉及到数据库设计、数据完整性以及日常的数据维护工作。以下将详细介绍这四个基本操作,并结合标签“源码”和“工具”来探讨如何在实践中高效地完成...

    oracle变更数据表字段类型

    接下来将详细介绍如何在Oracle中安全且高效地更改数据表中的字段类型。 #### 一、背景介绍 在日常的数据库维护工作中,可能因为业务需求的变化或其他原因,需要对已存在的数据表中的某个字段类型进行修改。例如,将...

    详解Oracle修改字段类型方法总结

    如果字段`name`有数据,而新类型与原类型不兼容,比如从`nchar(20)`改为`varchar2(40)`,由于`varchar2`和`nchar`在Oracle中处理方式不同,会遇到`ORA-01439`错误,提示列必须为空才能更改数据类型。此时,我们需要...

    Oracle数据库表中字段顺序的修改方法

    首先,让我们看看如何在Oracle中新增字段。新增字段的基本语法是: ```sql alter table tablename add (column datatype [default value][null/not null],…); ``` 例如,创建一个名为`test1`的表,并添加一个`id`...

    ORACLE 多表查询与数据修改

    您将学会如何正确地向表中插入新数据、更新已有数据以及删除不再需要的数据。 #### 实验环境 - **操作系统**:Windows 2000/XP - **数据库系统**:Oracle 10g #### 实验准备 为了更好地理解和实践本次实验的内容,...

    更改Oracle表中字段的顺序的终极方法

    由于Oracle并不支持直接调整字段顺序的功能,因此大多数情况下,人们会选择备份数据、删除原表然后根据新需求重建表的方式。这种方式虽然能够解决问题,但操作过程复杂且耗时较长,特别是在处理大型数据库时,这种...

    运用Java如何存取Oracle中的CLOB类型字段

    ### 运用Java如何存取Oracle中的CLOB类型字段 #### 概述 在数据库操作中,经常会遇到处理大量文本数据的需求,例如存储文章、新闻、文档等。Oracle数据库提供了CLOB(Character Large Object)类型来存储大容量的...

    oracle和sql数据类型

    Oracle 和 SQL 数据类型是数据库管理系统中用于定义和存储数据的基础组件。它们决定了数据的结构、大小以及如何进行处理。以下是两种数据库系统中主要数据类型的详细比较: **Oracle 数据类型** 1. **Char**: Char...

    常用的sql语句。新建表、删除表、插入数据、删除数据、更新数据、新增字段、删除字段、修改字段、新建约束、删除约束,等等常用语句

    `ALTER TABLE DROP COLUMN`命令用于从表中删除指定的字段。 **语法示例:** ```sql ALTER TABLE 表名 DROP COLUMN 字段名; ``` #### 八、修改字段 (Alter Column) `ALTER COLUMN`命令用于更改现有的字段属性。 *...

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

    在Oracle数据库中,CLOB(Character Large Object)类型字段用于存储大量的文本数据,如XML文档、长篇文章等。由于其特殊性,处理CLOB类型的字段时可能会遇到性能问题,特别是当涉及索引时。本话题将围绕如何针对...

    oracle修改表结构

    在Oracle数据库管理中,对表结构进行修改是一项常见的任务,涉及到添加字段、修改字段属性、删除字段、重命名表或字段、以及注释等操作。以下是对这些操作的详细解析: ### 添加字段 使用`ALTER TABLE`语句可以向...

    oracle中如何删除重复数据

    在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...

    Oracle基本数据类型.pdf

    本文将详细介绍 Oracle 中的一些基本数据类型,并探讨它们之间的区别和应用场景。 #### 二、字符数据类型 ##### 1. CHAR (n) - **定义**: 定长字符串,n 字节长,默认情况下 n 的范围是从 1 到 2000。 - **特点**...

    Oracle 修改数据库库表的各种情况和SQL语句

    - **数据类型不一致**:如果新旧默认值的数据类型不一致,则可能会遇到ORA-02262错误,在这种情况下需要先清除旧的默认值,再设置新的默认值。 #### 5. 修改NULLABLE属性 NULLABLE属性指的是字段是否允许为空。 -...

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

    在Oracle数据库中,确保表中特定字段具有唯一性是数据完整性的重要方面。这可以通过创建唯一约束或唯一索引来实现。以下是对"Oracle数据库表建立字段唯一性方法"的详细解释: 1. **唯一约束(Unique Constraint)**...

    oracle数据类型.doc

    Oracle 数据类型是数据库管理系统Oracle中的核心元素,它们决定了如何存储和处理各种数据。在Oracle中,数据类型可以分为基本数据类型、对象数据类型和大型对象数据类型。以下是对Oracle主要数据类型的详细说明: 1...

    oracle字段去重

    2. **备份数据:**在执行删除操作之前,最好先备份原始数据,以防意外情况发生。 3. **测试环境:**在生产环境中执行任何数据更改操作前,请确保已在测试环境中验证其正确性。 #### 五、总结 通过上述介绍,我们...

    Oracle基本数据类型

    5. **Long**:此数据类型用于存储长文本,最大长度可达2GB,但不支持索引,适用于不需要进行字符串搜索的情况。随着技术发展,Long类型逐渐被BLOB、CLOB、NCLOB等大对象类型替代。 6. **Raw(n)**:Raw类型用于存储...

Global site tag (gtag.js) - Google Analytics