這里模擬生產(chǎn)環(huán)境中的情況,先建一張沒(méi)有約束的表,等有一定數(shù)據(jù)后建立enable novalidate約束,進(jìn)而執(zhí)行enable validate來(lái)規(guī)范表中所有數(shù)據(jù),具體如下:
1. 創(chuàng)建原始表及數(shù)據(jù)
SQL> create table t1(
2 id number,
3 name varchar2(20));
SQL> insert into t1 values(1,'A');
SQL> insert into t1 values(1,'B');
SQL> insert into t1 values(2,'C');
SQL> insert into t1 values(3,'D');
SQL> insert into t1 values(3,'E');
SQL> insert into t1 values(4,'F');
2. 在表上創(chuàng)建enable novalidate主鍵
SQL> alter table t1 add constraint pk_t1 primary key (id)
2 deferrable enable novalidate;
此時(shí)主鍵已經(jīng)生效,但源表中包含不符合約束的數(shù)據(jù)
3. 嘗試將約束狀態(tài)更改為 enable validate,卻發(fā)現(xiàn)原有數(shù)據(jù)有問(wèn)題
SQL> alter table t1 enable validate constraint pk_t1;
alter table t1 enable validate constraint pk_t1
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-02437: 無(wú)法驗(yàn)證 (SCOTT.PK_T1) - 違反主鍵
4. 找出違反約束的數(shù)據(jù),這里采用Exceptions表保存異常數(shù)據(jù)
SQL>@%ORACLE_HOME%\RDBMS\Admin\utlexpt1.sql ------ 建立異常數(shù)據(jù)保存表
SQL>alter table t1 enable validate constraint pk_t1
SQL>exceptions into exceptions; ------ 將異常數(shù)據(jù)裝入異常表
5. 根據(jù)異常表,找出對(duì)應(yīng)源表中的異常數(shù)據(jù)
SQL> select id,name from t1 where rowid in(
2 select row_id from exceptions);
ID NAME
---------- --------------------
1 A
1 B
3 D
3 E
6. 修正異常數(shù)據(jù)后,將索引生效
聯(lián)系客服