`

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.执行脚本:
@%ORACLE_HOME%\RDBMS\ADMIN\utlexpt1.sql
2.SQL> create table tt1 as select * from emp;


表已创建。

已用时间:  00: 00: 00.12
3.创建一个未启用的主键:
SQL> alter table tt1 add constraint tt1_pk primary key(empno)disable;
表已更改。
4.修改表中数据,让其有重复记录。
已用时间:  00: 00: 00.00
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
SQL> select * from exceptions;

ROW_ID
---------------------------------------------------------------------------------------------------------
OWNER                          TABLE_NAME                     CONSTRAINT
------------------------------ ------------------------------ ------------------------------
AAAMeQAAEAAAAHkAAM
SCOTT                          TT1                            TT1_PK

AAAMeQAAEAAAAHkAAL
SCOTT                          TT1                            TT1_PK


已用时间:  00: 00: 00.01

6.查看违反约束条件的记录的详细信息
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
分享到:
评论

相关推荐

    视图禁用与启用

    约束禁用 –如果有大批量数据导入时,我们可以采用禁用约束的方法, 主要的好处,首先效率高,另外有主外键约束的表之间导 入时,不用考虑导入的先后顺序。 –禁用约束语法: ALTER TABLE table DISABLE ...

    Oracle批量执行sql语句之禁用所有表的外键

    oracle 删除(所有)约束 禁用(所有)约束 启用(所有)约束 执行以下sql生成的语句即可 1删除所有外键约束 select 'alter table '||table_name||' drop constraint '||constraint_name||';' from user_constraints ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    说明:Oracle中想要禁用或启用一个账户也同样是使用alter user 命令来完成,只是语法和修改密码有所不同。 用法: 禁用 alert user 用户名 account lock 启用 alert user 用户名 account unlock 4. 删除用户 说明:...

    oracle10g课堂练习II(1)

    备份约束条件 3-10 并行备份集 3-11 压缩备份 3-13 映像副本 3-14 备份和映像副本的标记 3-16 BACKUP 命令选项 3-17 备份归档重做日志 3-19 数据库整体备份 3-21 RMAN 备份类型 3-23 差异与累积 3-25 块...

    Oracle 10g 开发与管理

    3.启用和禁用角色 102 4.修改用户设置的角色 102 5.删除角色 102 四. 练习 102 五. 练习 103 六. 练习 104 七. 练习 105 第13讲 备份与恢复 106 一.数据库备份概述 106 1.备份和恢复 106 2.备份的类型 106 二....

    数据库设计和自动安装工具BDB V2.2(for Oracle/MS SQLServer/MySQL/Access/SQLAnywhere/Sybase)

    11、2007.11.28 Oracle、MySQL下导入数据增加禁用、重新启用外键约束处理。 12、2007.11.28 更正MySQL下处理导入日期类型字段数据问题。 13、2007.11.28 更正SQLServer下处理sql_variant、...

    精通sql结构化查询语句

    讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中的具体应用。...

    Oracle从入门到精通

    1.Oracle的构件和组件...................................... 2.数据库的物理结构:...................................... 1.控制文件................................................ 2. 数据文件...............

    jdk1.8.0_181(64位).7z

    支持Kerberos 5协议转换和约束委派 默认情况下禁用Kerberos 5弱加密类型 用于GSS-API / Kerberos 5机制的未绑定SASL 多个主机名的SASL服务 JNI在Mac OS X上桥接到本机JGSS 在SunJSSE提供商中支持更强大的临时DH...

Global site tag (gtag.js) - Google Analytics