查看錶TEST_PHONE_TAB的中繼資料:
SQL> select dbms_metadata.get_ddl('TABLE','TEST_PHONE_TAB') FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','TEST_PHONE_TAB')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."TEST_PHONE_TAB"
( "MOBILE" VARCHAR2(15),
"SENDCOUNT" NUMBER(20,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "DUQ_TEST_TBS01"
建立主鍵(包含一個同名索引和一個同名唯一約束)
經過時間: 00: 00: 00.31
SQL> alter table test_phone_tab add constraint test_phone_pk primary key(mobile);
表已更改。
經過時間: 00: 00: 00.01
查看修改表後的中繼資料:
SQL> select dbms_metadata.get_ddl('TABLE','TEST_PHONE_TAB') FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','TEST_PHONE_TAB')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."TEST_PHONE_TAB"
( "MOBILE" VARCHAR2(15),
"SENDCOUNT" NUMBER(20,0),
CONSTRAINT "TEST_PHONE_PK" PRIMARY KEY ("MOBILE")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEX
經過時間: 00: 00: 00.26
查看該表的索引的中繼資料
SQL> select dbms_metadata.get_ddl('INDEX','TEST_PHONE_PK') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX','TEST_PHONE_PK')
--------------------------------------------------------------------------------
CREATE UNIQUE INDEX "SCOTT"."TEST_PHONE_PK" ON "SCOTT"."TEST_PHONE_TAB" ("MOBILE")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
經過時間: 00: 00: 00.23
禁用約束:test_phone_pk
SQL> ALTER TABLE test_phone_tab disable constraint test_phone_pk;
表已更改。
經過時間: 00: 00: 00.03
禁用約束test_phone_pk後,再次查看該約束的中繼資料。但資料字典中已經沒有了
該索引。證明如果約束有索引,在禁用約束的時候,會自動刪除其對應的索引。
SQL> select dbms_metadata.get_ddl('INDEX','TEST_PHONE_PK') FROM DUAL;
ERROR:
ORA-31603: 對象 "TEST_PHONE_PK" 屬於類型 INDEX, 在方案 "SCOTT" 中未找到
ORA-06512: 在 "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: 在 "SYS.DBMS_METADATA", line 2697
ORA-06512: 在 "SYS.DBMS_METADATA", line 4220
ORA-06512: 在 line 1
未選定行
經過時間: 00: 00: 00.45
查看禁用約束後的表的中繼資料。
此時約束‘TEST_PHONE_PK’的狀態為‘DISABLE’。即:禁用。
SQL> select dbms_metadata.get_ddl('TABLE','TEST_PHONE_TAB') FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','TEST_PHONE_TAB')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."TEST_PHONE_TAB"
( "MOBILE" VARCHAR2(15),
"SENDCOUNT" NUMBER(20,0),
CONSTRAINT "TEST_PHONE_PK" PRIMARY KEY ("MOBILE") DISABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "DUQ_TEST_TBS01"
經過時間: 00: 00: 00.21
SQL> ALTER TABLE test_phone_tab enable constraint test_phone_pk;
表已更改。
經過時間: 00: 00: 00.01
查看啟用約束後的表的中繼資料。
此時約束‘TEST_PHONE_PK’的狀態為已不為‘DISABLE’。即:啟用。
SQL> select dbms_metadata.get_ddl('TABLE','TEST_PHONE_TAB') FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','TEST_PHONE_TAB')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."TEST_PHONE_TAB"
( "MOBILE" VARCHAR2(15),
"SENDCOUNT" NUMBER(20,0),
CONSTRAINT "TEST_PHONE_PK" PRIMARY KEY ("MOBILE")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEX
經過時間: 00: 00: 00.28
啟用約束後,其對應的索引已自動建立。
SQL> select dbms_metadata.get_ddl('INDEX','TEST_PHONE_PK') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX','TEST_PHONE_PK')
--------------------------------------------------------------------------------
CREATE UNIQUE INDEX "SCOTT"."TEST_PHONE_PK" ON "SCOTT"."TEST_PHONE_TAB" ("MOBILE")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"
經過時間: 00: 00: 00.09
找到違反約束條件的行
建立exceptions表。
1.執行指令碼:
Java代碼
- @%ORACLE_HOME%\RDBMS\ADMIN\utlexpt1.sql
- 2.SQL> create table tt1 as select * from emp;
@%ORACLE_HOME%\RDBMS\ADMIN\utlexpt1.sql2.SQL> create table tt1 as select * from emp;
表已建立。
經過時間: 00: 00: 00.12
3.建立一個未啟用的主鍵:
Java代碼
- SQL> alter table tt1 add constraint tt1_pk primary key(empno)disable;
SQL> alter table tt1 add constraint tt1_pk primary key(empno)disable;表已更改。
4.修改表中資料,讓其有重複記錄。
經過時間: 00: 00: 00.00
Java代碼
- SQL> update tt1 set empno=7900 where empno=7902;
SQL> update tt1 set empno=7900 where empno=7902;
已更新 1 行。
經過時間: 00: 00: 00.00
SQL> commit;
提交完成。
經過時間: 00: 00: 00.01
5.啟用主鍵約束,並讓違反約束條件的行插入表exceptions中。
SQL> alter table tt1 enable constraint tt1_pk exceptions into exceptions;
alter table tt1 enable constraint tt1_pk exceptions into exceptions
*
第 1 行出現錯誤:
ORA-02437: 無法驗證 (SCOTT.TT1_PK) - 違反主鍵
經過時間: 00: 00: 00.03
Java代碼
- SQL> select * from exceptions;
-
- ROW_ID
- ---------------------------------------------------------------------------------------------------------
- OWNER TABLE_NAME CONSTRAINT
- ------------------------------ ------------------------------ ------------------------------
- AAAMeQAAEAAAAHkAAM
- SCOTT TT1 TT1_PK
-
- AAAMeQAAEAAAAHkAAL
- SCOTT TT1 TT1_PK
-
-
- 經過時間: 00: 00: 00.01
SQL> select * from exceptions;ROW_ID---------------------------------------------------------------------------------------------------------OWNER TABLE_NAME CONSTRAINT------------------------------ ------------------------------ ------------------------------AAAMeQAAEAAAAHkAAMSCOTT
TT1 TT1_PKAAAMeQAAEAAAAHkAALSCOTT TT1 TT1_PK經過時間: 00: 00: 00.01
6.查看違反約束條件的記錄的詳細資料
Java代碼
- SQL> select * from tt1 where rowid in(
- 2 select row_id from exceptions);
-
- EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
- 7900 JAMES CLERK 7698 03-12月-81 950 30
- 7900 FORD ANALYST 7566 03-12月-81 3000 20
-
- 經過時間: 00: 00: 00.01