ORA-00001: unique constraint (HR.EMP_EMAIL_UK) violated

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xxzhaobb/article/details/88641376

在对表进行插入数据的时候,提示ORA-00001错误

HR@test>DECLARE
v_counter NUMBER(7) := 1000;
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO hr.employees
VALUES (v_counter,null,'Doe','[email protected]',null,'07-
JUN-02','AC_ACCOUNT',null,null,null,50);
v_counter := v_counter + 1;
END LOOP;
END;  2    3    4    5    6    7    8    9   10
 11  /
DECLARE
*
ERROR at line 1:
ORA-00001: unique constraint (HR.EMP_EMAIL_UK) violated
ORA-06512: at line 5


HR@test>

-- 查看约束,发现约束状态是disable ,但是在此插入数据的时候,发现还是ORA-00001 。

HR@test>select constraint_name,status,validated from dba_constraints 
where owner='HR' 
and table_name='EMPLOYEES' 
and constraint_name='EMP_EMAIL_UK'  2    3    4  ;

CONSTRAINT_N STATUS   VALIDATED
------------ -------- --------------
EMP_EMAIL_UK DISABLED NOT VALIDATED

HR@test>

- - 继续查询,发现有索引,索引状态是valid

HR@test>select index_name,status from dba_indexes
where owner='HR' 
and table_name='EMPLOYEES' 
and index_name='EMP_EMAIL_UK'  2    3    4  ;

INDEX_NAME     STATUS
-------------- --------
EMP_EMAIL_UK   VALID

HR@test>

-- 将索引状态invalid ,还可以使用enable和disable,但仅仅只针对函数索引

HR@test>alter index EMP_EMAIL_UK unusable;

Index altered.

HR@test>

-- alert log中的日志,显示索引为unusable .

2019-03-18T10:20:24.675067+08:00
Index HR.EMP_EMAIL_UK or some [sub]partitions of the index have been marked unusable

-- 再次插入数据,还是失败

HR@test>DECLARE
v_counter NUMBER(7) := 1000;
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO hr.employees
VALUES (v_counter,null,'Doe','[email protected]',null,'07-
JUN-02','AC_ACCOUNT',null,null,null,50);
v_counter := v_counter + 1;
END LOOP;
END;  2    3    4    5    6    7    8    9   10
 11  /
DECLARE
*
ERROR at line 1:
ORA-01502: index 'HR.EMP_EMAIL_UK' or partition of such index is in unusable
state
ORA-06512: at line 5

-- drop index试试,可以了。为什么必须drop掉索引呢?因为这个索引是unique索引,在insert操作的时候,会更新索引,所以还是会导致索引里面不是唯一值违反约束

HR@test>drop index emp_email_uk;

Index dropped.


HR@test>DECLARE
v_counter NUMBER(7) := 1000;
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO hr.employees
VALUES (v_counter,null,'Doe','[email protected]',null,'07-
JUN-02','AC_ACCOUNT',null,null,null,50);
v_counter := v_counter + 1;
END LOOP;
END;  2    3    4    5    6    7    8    9   10  
 11  /

PL/SQL procedure successfully completed.

HR@test>commit;

Commit complete.



HR@test>

END

猜你喜欢

转载自blog.csdn.net/xxzhaobb/article/details/88641376