ORACLE中約束的禁用和啟用

來源:互聯網
上載者:User
查看錶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代碼

  1. @%ORACLE_HOME%\RDBMS\ADMIN\utlexpt1.sql   
  2. 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代碼

  1. 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代碼

  1. 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代碼

  1. SQL> select * from exceptions;   
  2.   
  3. ROW_ID   
  4. ---------------------------------------------------------------------------------------------------------   
  5. OWNER                           TABLE_NAME                      CONSTRAINT   
  6. ------------------------------ ------------------------------ ------------------------------   
  7. AAAMeQAAEAAAAHkAAM   
  8. SCOTT                           TT1                             TT1_PK   
  9.   
  10. AAAMeQAAEAAAAHkAAL   
  11. SCOTT                           TT1                             TT1_PK   
  12.   
  13.   
  14. 經過時間:  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代碼

  1. SQL> select * from tt1 where rowid in(   
  2.   2   select row_id from exceptions);   
  3.   
  4.       EMPNO ENAME       JOB               MGR HIREDATE               SAL        COMM      DEPTNO   
  5. ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------   
  6.       7900 JAMES       CLERK           7698 03-12月-81            950                    30  
  7.       7900 FORD        ANALYST         7566 03-12月-81           3000                    20  
  8.   
  9. 經過時間:  00: 00: 00.01 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.