版权声明:本文为博主原创文章,未经博主允许不得转载。 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