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数据库中,我们经常需要对现有的表结构进行调整,比如增加新的字段、修改现有字段的属性或数据类型、删除不再使用的字段等。这些操作可以通过`ALTER TABLE`命令来完成。本文将详细介绍如何使用`ALTER TABLE`...
在Oracle数据库中,对表中字段的增删改查是数据库管理的基础操作,涉及到数据库设计、数据完整性以及日常的数据维护工作。以下将详细介绍这四个基本操作,并结合标签“源码”和“工具”来探讨如何在实践中高效地完成...
接下来将详细介绍如何在Oracle中安全且高效地更改数据表中的字段类型。 #### 一、背景介绍 在日常的数据库维护工作中,可能因为业务需求的变化或其他原因,需要对已存在的数据表中的某个字段类型进行修改。例如,将...
如果字段`name`有数据,而新类型与原类型不兼容,比如从`nchar(20)`改为`varchar2(40)`,由于`varchar2`和`nchar`在Oracle中处理方式不同,会遇到`ORA-01439`错误,提示列必须为空才能更改数据类型。此时,我们需要...
首先,让我们看看如何在Oracle中新增字段。新增字段的基本语法是: ```sql alter table tablename add (column datatype [default value][null/not null],…); ``` 例如,创建一个名为`test1`的表,并添加一个`id`...
您将学会如何正确地向表中插入新数据、更新已有数据以及删除不再需要的数据。 #### 实验环境 - **操作系统**:Windows 2000/XP - **数据库系统**:Oracle 10g #### 实验准备 为了更好地理解和实践本次实验的内容,...
由于Oracle并不支持直接调整字段顺序的功能,因此大多数情况下,人们会选择备份数据、删除原表然后根据新需求重建表的方式。这种方式虽然能够解决问题,但操作过程复杂且耗时较长,特别是在处理大型数据库时,这种...
### 运用Java如何存取Oracle中的CLOB类型字段 #### 概述 在数据库操作中,经常会遇到处理大量文本数据的需求,例如存储文章、新闻、文档等。Oracle数据库提供了CLOB(Character Large Object)类型来存储大容量的...
Oracle 和 SQL 数据类型是数据库管理系统中用于定义和存储数据的基础组件。它们决定了数据的结构、大小以及如何进行处理。以下是两种数据库系统中主要数据类型的详细比较: **Oracle 数据类型** 1. **Char**: Char...
`ALTER TABLE DROP COLUMN`命令用于从表中删除指定的字段。 **语法示例:** ```sql ALTER TABLE 表名 DROP COLUMN 字段名; ``` #### 八、修改字段 (Alter Column) `ALTER COLUMN`命令用于更改现有的字段属性。 *...
在Oracle数据库中,CLOB(Character Large Object)类型字段用于存储大量的文本数据,如XML文档、长篇文章等。由于其特殊性,处理CLOB类型的字段时可能会遇到性能问题,特别是当涉及索引时。本话题将围绕如何针对...
在Oracle数据库管理中,对表结构进行修改是一项常见的任务,涉及到添加字段、修改字段属性、删除字段、重命名表或字段、以及注释等操作。以下是对这些操作的详细解析: ### 添加字段 使用`ALTER TABLE`语句可以向...
在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...
本文将详细介绍 Oracle 中的一些基本数据类型,并探讨它们之间的区别和应用场景。 #### 二、字符数据类型 ##### 1. CHAR (n) - **定义**: 定长字符串,n 字节长,默认情况下 n 的范围是从 1 到 2000。 - **特点**...
- **数据类型不一致**:如果新旧默认值的数据类型不一致,则可能会遇到ORA-02262错误,在这种情况下需要先清除旧的默认值,再设置新的默认值。 #### 5. 修改NULLABLE属性 NULLABLE属性指的是字段是否允许为空。 -...
在Oracle数据库中,确保表中特定字段具有唯一性是数据完整性的重要方面。这可以通过创建唯一约束或唯一索引来实现。以下是对"Oracle数据库表建立字段唯一性方法"的详细解释: 1. **唯一约束(Unique Constraint)**...
Oracle 数据类型是数据库管理系统Oracle中的核心元素,它们决定了如何存储和处理各种数据。在Oracle中,数据类型可以分为基本数据类型、对象数据类型和大型对象数据类型。以下是对Oracle主要数据类型的详细说明: 1...
2. **备份数据:**在执行删除操作之前,最好先备份原始数据,以防意外情况发生。 3. **测试环境:**在生产环境中执行任何数据更改操作前,请确保已在测试环境中验证其正确性。 #### 五、总结 通过上述介绍,我们...
5. **Long**:此数据类型用于存储长文本,最大长度可达2GB,但不支持索引,适用于不需要进行字符串搜索的情况。随着技术发展,Long类型逐渐被BLOB、CLOB、NCLOB等大对象类型替代。 6. **Raw(n)**:Raw类型用于存储...