ORACLE中约束的禁用和启用


查看表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 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值