`

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
分享到:
评论

相关推荐

    Oracle 约束错误约束错误

    也可以使用 ALTER TABLE 语句来禁用约束,然后删除父表中的记录,最后再启用约束。 在 Oracle 中,ORA-02292 错误是由于违反了外键约束的条件,导致数据无法修改或删除。解决该错误的方法是,先修改子表中的记录,...

    视图禁用与启用

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

    禁用启用所有外键约束.tst

    本主题将围绕"禁用启用所有外键约束"这一话题展开,主要探讨如何在不同的数据库系统中进行操作。 首先,让我们来看看如何在MySQL中禁用和启用外键约束: 1. **禁用外键约束**: 在MySQL中,可以使用以下SQL语句...

    09oracle约束.pptx

    Oracle约束是数据库管理系统中用于确保数据完整性的重要机制。在Oracle数据库中,约束主要分为三类:域完整性、实体完整性和参照完整性。 1. 域完整性(Domain Integrity): 域完整性关注的是单个列的数据有效性...

    Oracle数据库Constraint约束的常用操作及异常处理[归类].pdf

    Oracle数据库Constraint约束的常用操作及异常处理...在实际操作中,需要熟悉约束的创建、启用、禁用和删除操作,并学会处理约束异常。本文介绍的常用操作和异常处理方法可以帮助开发者更好地理解和使用Constraint约束。

    Oracle数据库的完整性约束规则详解

    本文将深入探讨Oracle数据库中的五种主要完整性约束规则:Check、NOT NULL、Unique、Primary Key和Foreign Key。 #### 二、Check约束 Check约束用于验证数据列的值是否满足特定的条件,如数值范围、字符集等。这种...

    oracle电子文档:数据库约束.rar

    4. **禁用/启用约束**:在进行批量数据导入或更新时,可能需要临时禁用约束,以避免违反约束条件,然后在操作完成后重新启用。`ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;` 和 `ALTER TABLE table...

    Oracle 约束 总结

    ### Oracle约束总结 在Oracle数据库中,为了确保数据的一致性和完整性,我们常常需要使用到各种类型的约束。本文将详细地介绍Oracle中的五种主要约束类型:非空(NOT NULL)、唯一(UNIQUE)、主键(PRIMARY KEY)...

    数据库开发 Oracle数据库 SQL开发教程 第14章 约束(共33页).pdf

    在第14章“约束”中,我们深入理解了如何在Oracle数据库中实施约束,以确保数据的完整性和一致性。 约束是Oracle数据库中至关重要的一部分,它们是强制应用于表的一组规则,用来限制可以插入、更新或存在的数据类型...

    Oracle约束详解

    Oracle约束是数据库设计中的关键元素,用于确保数据的完整性和一致性。在Oracle数据库系统中,约束是用来限制可以插入或更新到表中的数据类型和值。它们是预防性地确保数据质量的规则,防止意外的数据输入错误或不...

    Oracle视频教程

    学习如何创建、启用和禁用约束,以及如何处理违反约束的错误,对于保持数据库的健康状态至关重要。 Oracle还包含丰富的内置函数,涵盖了数值、字符串、日期时间等多个领域。这些函数可以方便地进行数据转换、计算和...

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

    首先,让我们了解一下如何在Oracle中批量禁用所有表的外键约束。这通常涉及到三个主要步骤: 1. **删除所有外键约束**:虽然在实际操作中我们可能并不需要真正删除约束,而是暂时禁用,但了解这一操作是有益的。你...

    oracle database 10g 中文手册

    本章节将详细介绍Oracle Database 10g 中关于约束条件的管理及其状态控制。 #### 二、约束条件的基本概念 **1. 定义** - **约束条件**:用于限制可以插入、更新或删除的表数据的规则。 - **作用**:通过约束条件...

    2020_Oracle19c数据迁移图文详解.docx

    - 启用之前禁用的外键约束。 - 检查数据完整性。 #### 结论 通过使用Oracle数据泵技术,即使是在复杂的环境中也能顺利地完成数据迁移任务。本文档提供的步骤不仅详细而且易于理解,即便是初学者也能轻松掌握。在...

    Oracle基本运维管理介绍.pptx

    在Oracle的基本运维管理中,数据完整性和权限管理是两个至关重要的方面。以下是对这两个主题的详细说明。 首先,数据完整性是确保数据库中信息准确无误的关键。在Oracle中,有多种约束类型用于维护数据的完整性: ...

    Oracle面试题集锦

    12. **重建母表**:先禁用子表的外键约束,重建母表后再启用外键约束。 13. **归档与非归档模式**:归档模式支持完全恢复,但需要更多的存储空间和归档日志;非归档模式简化备份,但只能恢复到最后一个检查点。 14...

    oracle_database_11gR2_概念手册 中文版

    - 约束的创建、启用和禁用,以及异常处理。 - 触发器在保证数据完整性中的应用。 5. **第11章 物理存储结构**: - 数据块、区、段和表空间的层次结构,以及它们在存储管理中的作用。 - Oracle的自动存储管理...

    Oracle关键字(保留字)大全

    在Oracle数据库系统中,关键字或保留字是用来执行特定功能和操作的预定义标识符。这些关键字对于编写有效的SQL语句至关重要,因为它们帮助开发者构建出清晰、逻辑严谨的数据库查询与管理指令。本文将详细介绍Oracle...

Global site tag (gtag.js) - Google Analytics