EF操作oracle 表主键插入重复的主键 会导致主键索引不可用吗

求助:Oracle在表主键上另加函数索引后 插入记录时报ORA-04091
[问题点数:40分]
求助:Oracle在表主键上另加函数索引后 插入记录时报ORA-04091
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2010年9月 Oracle大版内专家分月排行榜第二
2011年4月 Oracle大版内专家分月排行榜第三2011年3月 Oracle大版内专家分月排行榜第三2011年1月 Oracle大版内专家分月排行榜第三
2010年9月 Oracle大版内专家分月排行榜第二
2011年4月 Oracle大版内专家分月排行榜第三2011年3月 Oracle大版内专家分月排行榜第三2011年1月 Oracle大版内专家分月排行榜第三
2010年9月 Oracle大版内专家分月排行榜第三2010年7月 Oracle大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。Oracle 10g删除主键约束后无法删除唯一约束索引问题的模拟与分析_数据库技术_Linux公社-Linux系统门户网站
你好,游客
Oracle 10g删除主键约束后无法删除唯一约束索引问题的模拟与分析
来源:Linux社区&
作者:Linux
当先创建唯一约束后再创建主键约束的情况下,如果使用普通方法删除主键约束后,唯一约束索引不会被删除,这是 10g的一个PROBLEM。
本文通过一个实验给大家演示一下这个问题的出现过程及处理方法。
【问题现象】在10g环境下,在删除主键约束后,在插入重复数据时候仍然报&ORA-00001: unique constraint (SEC.PK_T) violated&错误。现象是主键约束已经删除成功,但是唯一约束索引没有级联删除。
【问题模拟】1.创建表Tsec@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 a5sec@ora10g& col CONSTRAINT_NAME for a30sec@ora10g& col TABLE_NAME for a10sec@ora10g& col INDEX_OWNER for a12sec@ora10g& col INDEX_NAME for a10sec@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_
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_
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_
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
相关资讯 & & &
& (09/19/:36)
& (01/15/:23)
& (06/18/:25)
& (12/11/:47)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款oracle的主键和索引的关系是什么_百度知道
oracle的主键和索引的关系是什么
我在id列上建立了主键,那么,我还需要在id上建立索引吗
提问者采纳
没有必要再建索引.主键可以起到唯一索引的作用.
其他类似问题
按默认排序
其他4条回答
两者之间没什么关系啊,主键就是标识一个唯一的数据,如身份证唯一标识一个人。索引就是可以提高查询的数据,如书的目录就可以提高查询的速度
在数据操作上,主健等效于唯一索引。没有必要在再主键上创建索引了。如果要提高查询效率可以再其他符合的字段上另行创建!
没什么关系,主键为了防止重复数据,索引可以优化查询速度
在oracle中,我们创建一个主键,则同时自动创建了一个同名的唯一索引;删除主键,则主键约束和对应的唯一索引都删除了。这是我们经常见到的现象。 发出一个创建主键的sql,oracle其实执行了两步:创建主键约束、创建/关联 唯一索引。步骤是这样的:创建主键约束时,检查该主键字段上是否已经存在唯一索引。若不存在,则自动创建同名唯一索引;若存在,则直接创建主键约束,并将该约束和已经存在的唯一索引对应上。 删除主键约束时,可以决定是否保留对应的索引;删除唯一索引时,若存在对应的主键约束,则不能删除。 总之,存在主键约束,则肯定存在与之对应的唯一索引,而存在唯一索引,不一定对应着有主键约束。 下面我们验证一下: SQL& create table test_pri(a number(1), b number(1)); 表已创建。 --1.创建主键,则自动创建同名唯一索引--1.1创建主键,主键约束和唯一索引同时创建SQL& alter table test_pri add constraint pk_test_pri_a primary key(a); 表已更改。SQL& select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
from user_constraints where table_name = 'TEST_PRI'; CONSTRAINT_NAME
TABLE_NAME
INDEX_NAME
----------------- ------------ -------------PK_TEST_PRI_A
PK_TEST_PRI_A SQL& select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
from user_indexes where table_name = 'TEST_PRI'; INDEX_NAME
INDEX_TYPE
TABLE_NAME
UNIQUENES---------------- ------------ ------------ ---------PK_TEST_PRI_A
UNIQUE --1.2 删除主键,主键约束和对应的唯一索引都删除了SQL& alter table test_pri drop constraint pk_test_pri_a; 表已更改。 SQL& select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
from user_constraints where table_name = 'TEST_PRI'; 未选定行 SQL& select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
from user_indexes where table_name = 'TEST_PRI'; 未选定行 --1.3其实删除主键时可以选择保留索引的SQL& alter table test_pri add constraint pk_test_pri_a primary key(a); 表已更改。 SQL& alter table test_pri drop constraint pk_test_pri_ 表已更改。 SQL& select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
from user_constraints where table_name = 'TEST_PRI'; 未选定行 SQL& select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
from user_indexes where table_name = 'TEST_PRI'; INDEX_NAME
INDEX_TYPE
TABLE_NAME
UNIQUENES--------------- ----------- ----------- ---------PK_TEST_PRI_A
UNIQUE--2.在存在唯一索引的列上创建主键,则只创建主键约束,同时将该约束与已有唯一索引关联上(名称可以不一致)SQL& drop index pk_test_pri_a; 索引已丢弃。 --2.1 先创建唯一索引,再创建主键,名称可以不一致SQL& create unique index pk_test_pri_a on test_pri(a); 索引已创建。 SQL& alter table test_pri add constraint pk_test_pri primary key(a); 表已更改。 SQL& select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
from user_indexes where table_name = 'TEST_PRI'; INDEX_NAME
INDEX_TYPE
TABLE_NAME
UNIQUENES--------------- ----------- ------------ ---------PK_TEST_PRI_A
UNIQUE SQL& select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
from user_constraints where table_name = 'TEST_PRI'; CONSTRAINT_NAME
TABLE_NAME
INDEX_NAME------------------ ------------ -------------PK_TEST_PRI
PK_TEST_PRI_A --2.2 不可删除存在主键约束的唯一索引SQL& drop index PK_TEST_PRI_A;drop index PK_TEST_PRI_A
*ERROR 位于第 1 行:ORA-02429: 无法删除用于强制唯一/主键的索引 --2.3虽然两者名称不一致,但也是关联在一块的:删除约束,则对应的索引同时删除SQL& alter table test_pri drop constraint pk_test_
表已更改。 SQL& select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
from user_indexes where table_name = 'TEST_PRI'; 未选定行 SQL& select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
from user_constraints where table_name = 'TEST_PRI'; 未选定行 SQL&
oracle的相关知识
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Oracle在表的主键上另加函数索引后 插入记录时报ORA-04091
问题补充:amos_tl 写道主键加索引做什么
加了函数索引作其他统计用,此函数又用到统计的视图中了
PRAGMA AUTONOMOUS_TRANSACTION;
在该表的触发器加上这样的语句
ORA-04091应该是函数中访问变异表的问题,这个有个文章,你看看有用没
/drc/articles/1183456.html
主键加索引做什么
肯定表上有触发器
已解决问题
未解决问题

我要回帖

更多关于 oracle 删除主键 的文章

 

随机推荐