本节介绍以下内容:
■使用非唯一索引实现唯一性
■使用已启用的Novalidated约束
使用非唯一索引来实现唯一性
您可以在表上使用现有的非唯一索引来强制实现唯一性,无论是UNIQUE约束还是PRIMARY KEY约束的唯一方面。此方法的优点是在禁用约束时索引仍然可用且有效。因此,启用禁用的UNIQUE或PRIMARY KEY约束不需要重建与约束关联的唯一索引。这可以为大型表的启用操作节省大量时间。
使用非唯一索引来强制实现唯一性还可以消除冗余索引。如果包含该列作为复合索引的前缀,则不需要主键列上的唯一索引。您可以使用现有索引来启用和强制执行约束。您还可以通过不复制索引来节省大量空间。但是,如果现有索引已分区,则索引的分区键也必须是UNIQUE键的子集;否则,Oracle数据库会创建一个额外的唯一索引来强制执行约束。
使用启用的Novalidated约束
启用的无效约束的行为类似于新数据的已启用验证约束。在启用的无效状态中放置约束表示输入表中的任何新数据必须符合约束。不检查现有数据。通过在启用的无效状态中放置约束,可以在不锁定表的情况下启用约束。
如果将约束从禁用更改为启用,则必须锁定表。不会发生新的DML,查询或DDL,因为在启用操作期间,没有任何机制可以确保表上的操作符合约束。启用的无效状态会阻止用户对违反约束的表执行操作。
数据库可以使用表的并行一致读取查询来验证启用的无效约束,以确定是否有任何数据违反约束。数据库不执行锁定,因此启用操作不会阻止读取器或编写器。此外,数据库可以并行验证启用的无效约束。数据库可以同时验证多个约束,并使用并行查询检查每个约束的有效性。
使用以下方法创建具有约束和索引的表:
1.使用约束创建表。 NOT NULL约束可以是未命名的,应该创建启用和验证。您应该命名所有其他约束(CHECK,UNIQUE,PRIMARY KEY和FOREIGN KEY)并禁用它们。
2.将旧数据加载到表中。
3.创建所有索引,包括约束所需的索引。
4.Enable novalidate所有约束。在外键之前对主键执行此操作。
5.允许用户查询和修改数据。
6.对每个约束使用单独的ALTER TABLE语句,验证所有约束。 在外键之前对主键执行此操作。 例如,
CREATE TABLE t (a NUMBER CONSTRAINT apk PRIMARY KEY DISABLE,
b NUMBER NOT NULL);
CREATE TABLE x (c NUMBER CONSTRAINT afk REFERENCES t DISABLE);
Now load data into table t.
CREATE UNIQUE INDEX tai ON t (a);
CREATE INDEX tci ON x (c);
ALTER TABLE t MODIFY CONSTRAINT apk ENABLE NOVALIDATE;
ALTER TABLE x MODIFY CONSTRAINT afk ENABLE NOVALIDATE;
此时,用户可以开始对表t执行INSERT,UPDATE,DELETE和SELECT操作。
ALTER TABLE t ENABLE CONSTRAINT apk;
ALTER TABLE x ENABLE CONSTRAINT afk;
现在,约束已启用并经过验证。