
维护数据完整性.doc
3页征信软件开发部数据库小组陈陵涛第 1 页2018-06-18维护数据完整性维护数据完整性1. 维护数据完整性的三种途径维护数据完整性的三种途径应用程序 数据库触发器 通常只有在完整性约束不能够完全定义复杂的业务逻辑时才使用 定义的完整性约束 优点: 提供更高的效率 更容易定义和修改 规则管理更加集中 更灵活(disable 和 enable) 在数据字典中可以查找完整定义2. 完整性约束的种类完整性约束的种类NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK (用于定义表中每列或者几列必须满足的条件)3. 约束状态约束状态DISABLE NOVALIDATE 无论是老数据还是新数据都不遵守约束 DISABLE VALIDATE 如果置于这个状态所有关于约束的列都不允许修改(modify) 另外在这个约束上 的索引被 dropped,这个约束 is disabled 注释:如果这个约束 is deferrable ,索引不会被 dropped ENABLE NOVALIDATE 这种状态下,新数据如果违反了约束,不允许插入。
但表中可能包含某些违反约 束的数据这种情况在 OLTP 系统向数据仓库加载数据比较适用 ENABLE VALIDATE 新的违反约束的数据不允许被插入,老数据也不允许违反约束 如果一个约束由别的状态改为 ENABLE VALIDATE,数据库将花费很长的时间检 查老数据,导致其他 DML 操作(如数据加载)等待所以通常情况下,先改为征信软件开发部数据库小组陈陵涛第 2 页2018-06-18ENABLE NOVALIDATE,然后再改为 ENABLE VALIDATE 通常 ENABLE 暗示了 VALIDATE,DISABLE 暗示了 NOVALIDATE,除非特别指出如果一个唯一或者主键约束由 DISABLE 改为 ENABLE,将会自动创建唯一索引 反之,索引将被 dropped 由 NOVALIDATE 改为 VALIDATE,所有的数据将被检查一遍 将一个独立的约束改为 ENABLE NOVALIDATE 改为 ENABLE VALIDATE 不会 导致其他 DDL 语句的读写锁4. 约束检查约束检查Nondeferred or immediate Deferred (当整个事务全部提交时,才进行约束检查) 定义约束 Immediate 或者 Deferred ALTER SESSION SET CONSTRAINT[S] = {IMMEDIATE|DEFERRED|DEFAULT}5. 创建表时定义约束创建表时定义约束创建表时定义约束采用下列语法: column datatype [CONSTRAINT constraint]{[NOT] NULL|UNIQUE [USING INDEX index_clause]|PRIMARY KEY [USING INDEX index_clause]|REFERENCES [schema.]table [(column)][ON DELETE CASCADE]|CHECK (condition)}constraint_state :==[NOT DEFERRABLE|DEFERRABLE [INITIALLY {IMMEDIATE|DEFERRED}]][DISABLE|ENABLE [VALIDATE|NOVALIDATE]]6. 定义约束时的考虑定义约束时的考虑主键或者唯一约束 将索引放在单独的表空间 大量加载(bulk loads)频繁发生时,采用非唯一的索引 Self-reference 外键征信软件开发部数据库小组陈陵涛第 3 页2018-06-18在初始加载后再定义或者 enable 外键 延迟约束检查7. 使用使用 EXCEPTIONS 表表1)创建意外表 2)运用 EXCEPTIONS 子句执行 ALTER TABLE 命令 SQL> ALTER TABLE hr.employeeENABLE VALIDATE CONSTRAINT employee_dept_id_fkEXCEPTIONS INTO system.exceptions; 3)从 EXCEPTION 表中查找不合格数据 4)纠正数据错误 5)Truncate EXCEPTION 表重新激活约束。
8. 获取约束信息获取约束信息从下列视图中获取约束信息: DBA_CONTRAINTS DBA_CONS_COLUMNS DBA_CONTRAINTS 表中字段定义如下表:NameDescriptionCONSTRAINT_TYPEThe type of constraint is P if Primary Key, U if Unique, R if foreign key, or C if Check constraint. NOT NULL constraints are stored as check constraints.SEARCH_CONDITIONShows the condition specified for a check constraintR_OWNER R_CONSTRAINT_NAMEDefines the owner and name of the referenced constraint for foreign keysGENERATEDIndicates if the constraint name is system-generated (Valid values are USERNAME and GENERATED NAME.)BADIndicates that the constraint is to be rewritten to avoid situations such as the Year 2000 problemsRELYIs used in the optimizer, if this flag is setLAST_CHANGEShows the date when the constraint was last enabled or disabled。
