维护数据完整性
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操作(如数据加载)等待。所以通常情况下,先改为ENABLE 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)}
session数据错误是什么意思 constraint_state :==
[NOT DEFERRABLE|DEFERRABLE [INITIALLY {IMMEDIATE|DEFERRED}]]
[DISABLE|ENABLE [VALIDATE|NOVALIDATE]]
6. 定义约束时的考虑
⏹ 主键或者唯一约束
将索引放在单独的表空间
大量加载(bulk loads)频繁发生时,采用非唯一的索引
⏹ Self-reference 外键
在初始加载后再定义或者enable外键
延迟约束检查
7. 使用EXCEPTIONS表
1) 创建意外表
2) 运用EXCEPTIONS子句执行ALTER TABLE命令
SQL> ALTER ployee
ENABLE VALIDATE CONSTRAINT employee_dept_id_fk
EXCEPTIONS ptions;
3) 从EXCEPTION表中查不合格数据
4) 纠正数据错误
5) Truncate EXCEPTION表重新激活约束。
8. 获取约束信息
从下列视图中获取约束信息:
DBA_CONTRAINTS
DBA_CONS_COLUMNS
DBA_CONTRAINTS表中字段定义如下表:
Name | Description |
CONSTRAINT_TYPE | The 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_CONDITION | Shows the condition specified for a check constraint |
R_OWNER R_CONSTRAINT_NAME | Defines the owner and name of the referenced constraint for foreign keys |
GENERATED | Indicates if the constraint name is system-generated (Valid values are USERNAME and GENERATED NAME.) |
BAD | Indicates that the constraint is to be rewritten to avoid situations such as the Year 2000 problems |
RELY | Is used in the optimizer, if this flag is set |
LAST_CHANGE | Shows the date when the constraint was last enabled or disabled |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论