当先创建唯一约束后再创建主键约束的情况下,如果使用普通方法删除主键约束后,唯一约束索引不会被删除,这是Oracle 10g的一个PROBLEM。
本文通过一个实验给大家演示一下这个问题的出现过程及处理方法。
【问题现象】
在10g环境下,在删除主键约束后,在插入重复数据时候仍然报“ORA-00001: unique constraint (SEC.PK_T) violated”错误。
现象是主键约束已经删除成功,但是唯一约束索引没有级联删除。
【问题模拟】
1.创建表T
sec@ora10g> create table t (x int, y int);
Table created.
2.先创建惟一约束索引
sec@ora10g> create unique index pk_t on t (x);
Index created.
3.再创建主键约束
sec@ora10g> alter table t add (constraint pk_t primary key(x));
Table altered.
4.查看约束信息
sec@ora10g> col OWNER for a5
sec@ora10g> col CONSTRAINT_NAME for a30
sec@ora10g> col TABLE_NAME for a10
sec@ora10g> col INDEX_OWNER for a12
sec@ora10g> col INDEX_NAME for a10
sec@ora10g> select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_OWNER,INDEX_NAME from user_constraints where table_name = 'T';
OWNER CONSTRAINT_NAME C TABLE_NAME INDEX_OWNER INDEX_NAME
----- ------------------------------ - ---------- ------------ ----------
SEC PK_T P T SEC PK_T
5.查看索引信息
sec@ora10g> select INDEX_NAME,INDEX_TYPE,GENERATED from user_indexes;
INDEX_NAME INDEX_TYPE G
---------- --------------------------- -
PK_T NORMAL N
GENERATED字段说明:
GENERATED VARCHAR2(1) Indicates whether the name of the index is system generated (Y) or not (N)
6.删除主键约束
sec@ora10g> alter table t drop constraint pk_t cascade;
Table altered.
7.确认约束和索引删除情况
sec@ora10g> select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_OWNER,INDEX_NAME from user_constraints where table_name = 'T';
no rows selected
sec@ora10g> select INDEX_NAME,INDEX_TYPE,GENERATED from user_indexes;
INDEX_NAME INDEX_TYPE G
---------- --------------------------- -
PK_T NORMAL N
可见,此时索引没有被删除。
因此,此时如果插入重复的数据,还是会报违反“约束”
sec@ora10g> insert into t values (1,1);
1 row created.
sec@ora10g> insert into t values (1,1);
insert into t values (1,1)
*
ERROR at line 1:
ORA-00001: unique constraint (SEC.PK_T) violated
- 大小: 51.5 KB
分享到:
相关推荐
在windows环境中彻底删除oracle10g法宝。
创建学员信息表--创建唯一索引--修改学员信息表添加主键和检查约束
oracle10G和11G的OCI.dll,主要用于navicat工具;oracle10G和11G的OCI.dll,主要用于navicat工具
oracle,Oracle10g在Oracle10g上的安装与配置
OracleGoldenGate针对表没有主键或唯一索引的解决方案[归类].pdf
第1章 Oracle Database 10g体系结构 第2章 安装Oracle Database 10g和创建数据库 第3章 升级到Oracle Database 10g 第4章 规划Oracle应用程序——方法、风险和标准 第Ⅱ部分 SQL和SQL*Plus 第5章 SQL中的基本语法 第...
如何彻底删除Oracle 10 G数据库 Oracle 删除 数据库
如何在oracle中查询所有用户表的表名、主键名称、索引、外键等
Oracle10g-linux安装包
oracle数据库驱动。包含了oracle oracle10g、11g、12c、19c的jar驱动包。解压密码是123456。
文件是本人oracle10g分区表自动按时间创建、删除分区的存储过程,测试代码,通过job调用存储过程,每天午夜12点运行一次。妥妥!跟大家分享下!
1z0-033-13 关于自动段空间管理 ext 与oracle 空间使用 percent oracle块参数 行迁移问题 什么时间进行索引重组 优化性能 13 1z0-033-15 讨论不同类型索引 索引组织表(簇化表) OLTP 有什么性质要求 13 1z0-033-18-...
1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 执行上面的SQL可以删除主键;如果不成功可以用 ... --删除主键索引 2,查看主键约束 SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='P' AND
redhat5 下安装oracle10g redhat6下安装oracle11g 详细到装虚拟机,文件配置,安装详细过程
删除索引 drop index CUS_LOWER_ENERGY_JLDNY; 新建一个索引 create index CUS_LOWER_ENERGY_JLDNY on CUS_LOWER_ENERGY (JLDBH, DLNY,HWBZ) tablespace TS_DSM_INDEX pctfree 10 initrans 2 maxtrans 255 ...
Oracle 10g入门与提高 ppt 大家可以下下来! 适合新手看看!
Linux下Oracle 10g安装 有不少网友需要,学习在Linux上从头安装 Oracle 数据库 10g 的基础知识(仅用于评估)。
ORACLE10G安装步骤ORACLE10G安装步骤ORACLE10G安装步骤