12索引
管理索引
列出不同类型的索引及其用途
创建各种类型的索引
重新组织索引
维护索引
监视索引的使用情况
获取索引信息
索引的分类
逻辑:
单列或串联
唯一或非唯一
基于函数的
域
物理:
分区或非分区
B-tree:正反键
位图
在Oracle数据库中,常见的索引类型包括以下几种:
1. B-Tree索引:B-Tree索引是Oracle中最常用的索引类型。它使用B-Tree数据结构来组织索引数据,适用于等值查找、范围查询和排序操作。Oracle的B-Tree索引也支持表达式索引和函数索引,可以在索引中存储和处理计算得到的值。
2. 唯一索引:唯一索引用于确保索引列的值在表中是唯一的。它可以通过UNIQUE约束或CREATE UNIQUE INDEX语句创建。唯一索引可以提高查询的性能,并确保数据的完整性。
3. 聚集索引:聚集索引是根据表的主键对数据进行物理排序的索引。在Oracle中,主键自动创建一个聚集索引。聚集索引是表的存储结构的一部分,以主键的形式存在。
4. 分区索引:分区索引是基于表的分区进行创建的索引。它可以提高分区表的查询性能,将索引分布在不同的分区上,以减少查询范围。分区索引可以是B-Tree索引或唯一索引。
5. 位图索引:位图索引是一种特殊的索引类型,在特定情况下可以提供高效的查询性能。位图索引适用于对低基数列进行等值查找,例如性别、状态等具有有限取值的列。
6. 函数索引:函数索引是基于表达式的索引,可以对计算结果进行索引。它允许在索引中存储和处理计算得到的值,从而提高查询的性能和灵活性。
在实际应用中,选择合适的索引类型取决于数据的特点、查询需求和性能需求。根据具体情况,在表中创建合适的索引可以提高数据库的查询性能和数据处理效率。
B-tree 索引
B-Tree(或称平衡树)是一种常见的索引结构,广泛应用于数据库系统中,用于加速数据的检索和查询。B-Tree索引使用一种树结构组织数据,其中每个节点包含多个子节点和关键字。
B-Tree索引的特点包括:
1. 平衡性:B-Tree保持树的平衡,使得在最坏情况下,所有叶节点的深度相同,提供了稳定的检索性能。
2. 多路性:B-Tree具有多个子节点,使得每个节点可以包含更多的关键字。这样可以减少树的深度,从而减少磁盘I/O次数,提高查询效率。
3. 自适应性:B-Tree可以在插入或删除操作时自动调整树的结构,保持平衡性。这使得B-Tree适用于动态数据集合,可以高效地处理更新操作和并发访问。
B-Tree索引常用于数据库系统中的索引结构,用于加快查询操作。它可以用于支持等值查找、范围查询和排序操作等。在数据库中,通常会根据表中某个列的值来建立B-Tree索引,以加快对该列的检索速度。
总而言之,B-Tree索引是一种高效的数据结构,适用于处理大规模数据的索引和查询操作,在数据库系统中得到广泛应用。
Bitmap Indexes(位图索引)
位图索引是一种用于加快数据库查询速度的索引类型。位图索引是一个二进制位的向量,其中每个位子表示一个行的状态。一个位上的值表明,对应的行是否具有某个属性,如一个列中是否包含某个值。每个位子上的值为1或0,表示对应行是否具有指定的属性。这种索引基于位操作,可用于提高对需要大量数据查询的列的检索速度。
位图索引通常用于高并发,多查询的数据仓库系统,它可用于加速复杂的分析型查询,例如针对大型记录集合的复杂数据聚合和过滤操作。使用位图索引可能需要占用大量的存储空间,因此通常仅用于较小的维度表和非唯一列。同时,维护位图索引也可能需要较长的时间,因此在实际应用中需要根据具体情况进行权衡和测试
B_Tree vs Bitmap
创建 B_Tree 索引
create index hr.employess_last_name_idx
on hr.employess(last_name)
PCTREE 30
stporage(initial 200k next 200k
pctincrease 0 maxextents 50)
tablespace indx;
创建索引的方法
平衡查询和DML需求。
放在单独的表空间中。
使用统一的范围大小: 5块的倍数或表空间的最小范围大小。
考虑对大型索引进行NOLOGGING。
initran在索引上的值通常应该高于相应表上的值。
创建索引:使用实例
创建位图索引
CREATE BITMAP INDEX order_region_id_idx
ON order(region_id)
PCTFREE 30
STORAGE(INITIAL 200K NEXT 200K
PCTINCREASE 0 MAXEXTENTS 50)
TABLESPACE indx;
索引的存储参数
ALTER INDEX employees_last_name_idx
STORAGE(NEXT 400K
MAXEXTENTS 100);
分配& Dealloc索引空间
ALTER INDEX orders_region_id_idx
ALLOOCATE EXTENT (SIZE 200K
DATAFILE '/DISK6/indx01.dbf');
#释放空间
ALTER INDEX order_id_idx
DEALLOCATE UNUSED;
重新创建索引
重新创建索引是指删除现有的索引,然后重新建立相同的索引。这个过程可以用来优化索引结构、修复索引损坏或解决索引性能问题。
在重新创建索引之前,首先需要评估索引的使用情况和性能问题。确定需要重新创建的索引,并根据实际需求做出相应的调整和优化。
在Oracle数据库中,可以使用以下步骤重新创建索引:
1. 检查索引状态:使用`SELECT`语句或数据库管理工具查看索引的状态和使用情况。确认索引是否存在问题,并确定是否需要重新创建。
2. 创建索引备份:在删除现有索引之前,最好先创建一个备份。这可以通过使用`CREATE TABLE AS SELECT`语句将原始索引的定义和数据复制到新表中。
3. 删除现有索引:使用`DROP INDEX`语句删除原始索引。请注意,在删除索引之前,确保没有其他依赖于该索引的对象。
4. 重新创建索引:使用`CREATE INDEX`语句重新创建索引。根据实际需求,可以调整索引的参数和选项以优化性能。例如,可以选择适当的存储参数、并行度、填充因子等。
5. 验证索引状态:重新创建索引后,使用`SELECT`语句或数据库管理工具验证新索引的状态和使用情况。确保索引被正确创建并正常使用。
请注意,在重新创建索引过程中,可能会对数据库系统产生一定的负载和影响。因此,建议在低峰期或备份之后进行重新创建索引的操作。同时,对于大型表或繁忙的环境,可以考虑使用并行索引创建等技术来加速索引的重建过程。
使用ALTER INDEX命令:
将索引移动到不同的表空间
通过删除已删除的条目来提高空间利用率
ALTER INDEX orders_region_id_idx REBULLD
TABLESPACE indx02;
离线索引重建
1. 锁上表。
2.通过读取现有索引的内容来创建一个新的临时索引。
3. 删除原始索引。
4. 重命名临时索引,使其看起来像原始索引。
5. 移除表锁。
在下列情况下重建索引:
现有索引必须移动到不同的表空间。如果索引与表位于相同的表空间中,或者需要跨磁盘重新分发对象,则可能需要这样做。
索引包含许多已删除的条目。这是滑动索引的典型问题,例如订单表的订单号索引,其中已完成的订单被删除,而编号更高的新订单被添加到表中。如果有几个旧订单未完成,则可能有几个索引叶块,其中除了几个已删除的条目外,其他条目都已删除。
已存在的正常索引必须转换为反向键索引。从Oracle服务器的早期版本迁移应用程序时可能会出现这种情况。
使用ALTER命令将索引表移动到另一个表空间
TABLE ... MOVE TABLESPACE
在线重新创建索引
在线索引重建指的是在不停止数据库服务的情况下,对数据库中的索引进行重建操作。在线索引重建能够避免对数据库服务造成中断和影响,同时提高数据库系统的可用性和灵活性。
在Oracle等数据库系统中,常用的在线索引重建方法包括以下几种:
1. ALTER INDEX REBUILD ONLINE:该命令可以在Oracle数据库中重建索引,不需要停止数据库服务。该命令会创建一个与原索引同名的新索引,然后将原索引的数据移动到新索引中。在整个过程中,原索引仍然是可用的,但可能会影响查询性能。
2. DBMS_REDEFINITION包:该包是Oracle数据库中用于进行在线重建的工具。使用该包可以在不停止数据库服务的情况下,对表的索引和存储结构进行重建。该工具支持较复杂的重建操作,但使用时需要谨慎。
3. DDL重建:对于小型的索引重建任务,可以通过DROP和CREATE命令来实现。这种方法需要停止数据库服务,因此只适用于数据量小或需要进行紧急重建的情况。
需要注意的是,在线索引重建可能会导致一些性能问题,包括重建过程中的锁冲突和IO负载等。在进行在线索引重建之前,需要仔细评估系统的性能需求和可用性需求,选择合适的重建方法和重建策略。同时,需要对重建过程中的错误和异常情况进行充分考虑,保证系统的稳定性和数据的完整性。
索引可以用最小的表锁定来重建。
ALTER INDEX orders_id_idx REBULLD ONLINE;
一些限制仍然适用。
在线创建索引的过程
1. 锁上表。
2. 创建一个新的、临时的空索引和一个IOT来存储正在进行的DML。
3.释放表锁。
4. 通过读取现有索引的内容来填充临时索引。
5. 将物联网的内容与新索引合并。
6. 锁上表。
7. 最终从IOT合并并删除原始索引。
8. 重命名临时索引,使其看起来像原始索引。
9. 移除表锁。
IOT
IOT 指的是 Oracle 数据库中的索引组织表(Index-Organized Table)。IOT 是一种特殊的表,在物理上采用 B-tree 索引组织表,并且数据行的存储方式是基于索引的。与传统的堆表(Heap-Organized Table)相比,IOT 具有以下几个优点:
1. 减少存储空间:IOT 可以通过使用索引结构来存储数据,避免了存储冗余数据的情况,因此可以减少存储空间的使用。
2. 提高查询性能:由于 IOT 中数据行的物理存储方式与索引结构相同,因此查询时不需要额外的 IO 操作,可以提高查询性能和响应速度。
3. 支持范围查询:IOT 支持基于索引的范围查询,这意味着可以直接从索引中检索一系列数据行,而不需要扫描整个表。
4. 索引自动维护:IOT 中的索引会自动随着数据的更新而进行更新,无需手动维护,更加方便。
在实际应用中,IOT 主要用于需要频繁进行范围查询或等值查询,同时对存储空间和性能有一定要求的场景,例如数据库中的历史记录表或日志表等。使用 IOT 可以显著提高查询性能和数据库系统的处理效率。但是,由于 IOT 的特殊存储方式,它对于插入或更新操作的开销会更大,因此需要根据具体场景进行选择和评估。
DML 是数据库操作语言(Data Manipulation Language)的缩写,用于对数据库中存储的数据进行操作。常见的 DML 操作包括插入、查询、更新和删除数据。以下是 DML 的一些常见操作:
1. 插入数据(INSERT):使用 INSERT 语句将新的数据行插入到数据库表中。语法通常为:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...)。
2. 查询数据(SELECT):使用 SELECT 语句从数据库表中检索数据。可以使用 WHERE 子句来过滤数据行,使用 ORDER BY 子句来排序数据。常用的 SELECT 语句语法为:SELECT column1, column2, ... FROM table_name WHERE conditions ORDER BY column_name。
3. 更新数据(UPDATE):使用 UPDATE 语句修改数据库表中的数据。可以通过 WHERE 子句指定要更新的数据行,然后使用 SET 子句来指定要修改的列和新值。语法通常为:UPDATE table_name SET column1 = value1, column2 = value2 WHERE conditions。
4. 删除数据(DELETE):使用 DELETE 语句从数据库表中删除数据行。可以通过 WHERE 子句指定要删除的数据行。语法通常为:DELETE FROM table_name WHERE conditions。
除了这些常见的 DML 操作,还有其他一些特殊的操作,比如批量插入(INSERT INTO ... SELECT)、合并(MERGE)等,这些操作可以根据具体数据库系统和需求来使用。
需要注意的是,在进行 DML 操作时,特别是对于修改和删除数据的操作,要小心操作,确保操作的准确性和完整性。同时,应该根据数据库表的结构和索引情况来进行优化,以提高 DML 操作的性能和效率。
合并索引
合并索引(Merge Index)是指将多个重复的索引合并成一个单独的索引,以减少存储空间和提高查询性能。合并索引通常适用于具有大量重复索引的数据库表,例如在多个列上创建了多个单列索引,导致索引数量过多和占用存储空间过多的情况。
在 Oracle 数据库中,合并索引可以通过以下步骤实现:
1. 检测索引:使用系统监控工具或查询数据库字典视图来查看数据库中的索引。识别那些需要合并的重复索引。
2. 创建新索引:使用 CREATE INDEX 语句创建一个新的、包含所有重复索引键值的索引。可以根据需要包含每个单独的索引中的所有列。
3. 备份旧索引:在删除旧索引之前,先进行数据备份。可以创建备份表,然后使用 INSERT INTO SELECT 语句将原始索引数据复制到备份表中。
4. 删除旧索引:使用 DROP INDEX 语句删除所有需要合并的旧索引。
5. 重命名新索引:为了避免更改数据库查询计划,将新索引重命名为原始索引的名称或别名。
6. 验证合并的索引:重新检查数据库中的索引,确保所有重复的索引都已被合并到新的索引中。同时,可以使用系统监控工具或测试查询来验证新索引的查询性能。
值得注意的是,合并索引可能会影响数据库性能并消耗大量的资源。因此,在进行索引合并之前,应该评估索引使用情况,确保合并后的索引确实能够提高查询性能和节省存储空间。同时,可以对于大型表或繁忙环境下的索引合并,可以考虑使用并行索引合并等技术,以加速索引合并的过程。
ALTER INDEX orders_id_idx COALESCE;
1.沿着索引的底部扫描。
2. 如果相邻节点可以合并为单个节点,则这样做。
2的效率最高
碎片化多的时候重建索引
碎片化少用合并
检查索引有效性
ANALYZE INDEX orders_region_id_idx
VALLDATE STRUCTUER;
要检查索引的有效性,可以通过以下方法来进行:
1. 查询数据库系统的元数据:使用数据库管理系统提供的元数据视图或表,查询索引的定义和属性信息。例如,在 Oracle 数据库中,可以查询 DBA_INDEXES 或 USER_INDEXES 视图,查看索引的状态、列以及有效性的标识。
2. 检查索引统计信息:索引的有效性通常与其统计信息的准确性和最新性相关。使用数据库管理系统提供的统计信息收集工具或语句(如 Oracle 的 ANALYZE 或 DBMS_STATS 包),可以重新收集或更新索引的统计信息,并评估其有效性。
3. 使用查询计划:执行针对包含索引的查询语句,观察查询计划以确定索引是否被使用。如果查询计划中显示使用了索引,那么索引很可能是有效的。否则,可能需要进一步检查索引的定义和统计信息。
4. 观察查询性能:通过执行实际的查询操作来测试索引的性能。可以比较使用索引和不使用索引时查询的执行时间或扫描行数等指标,以评估索引对查询性能的影响。较快的执行时间和较少的扫描行数通常表示索引的有效性。
5. 使用数据库性能调优工具:不同的数据库管理系统提供了一些性能调优工具,可以帮助检查和评估索引的有效性。例如,在 Oracle 数据库中,可以使用 SQL Tuning Advisor、Automatic Workload Repository (AWR) 或 SQL Performance Analyzer 等工具来识别和改善索引性能问题。
需要注意的是,索引的有效性是动态的,可能会随着数据库的使用情况和数据的变化而变化。因此,定期检查和评估索引的有效性是重要的,可以根据实际的数据库性能需求和查询模式来进行索引的调整和优化。
删除索引
在批量加载之前删除并重新创建索引。
删除不经常需要的索引,并在必要时构建索引。
删除并重新创建无效索引。
DROP INDEX hr.departments_name_idx;
在数据库中,删除索引通常使用 DROP INDEX 语句来执行。删除索引可以帮助节省存储空间、提高数据库性能和降低维护成本,但也会影响查询性能和数据完整性等方面。
以下是一些删除索引的注意事项:
1. 检查索引依赖关系:在删除索引之前,应该检查索引的依赖关系,确定该索引没有被其他对象(例如视图、函数或存储过程)所引用。如果存在依赖关系,则需要先解除依赖关系,再删除索引。
2. 检查索引使用情况:在删除索引之前,应该检查索引的使用情况,确定该索引没有被任何查询语句所使用。如果该索引是频繁使用的,删除它可能会导致性能问题。可以通过查询查询计划、监视数据库活动或使用性能分析工具等方式来检查索引的使用情况。
3. 检查索引类型:在删除索引之前,应该确定该索引是单列索引还是复合索引,以及它是唯一索引、主键索引、外键索引还是普通索引。这些信息对于数据库的完整性和查询性能都非常重要。
4. 执行备份操作:在删除索引之前,最好先执行数据备份操作,以确保可以恢复数据。可以使用各种备份和恢复工具,如数据导出/导入、冷备份或热备份等。
5. 删除索引:使用 DROP INDEX 语句删除索引。语法通常为:DROP INDEX index_name ON table_name。
需要注意的是,在删除索引之前,应该仔细评估它的使用情况和影响范围,确保没有由此造成不良后果。
识别未使用的索引
开始监控索引的使用情况。
ALTER INDEX hr.dept_id_idx
MONITORING USAGE
停止监视索引的使用情况。
ALTER INDEX hr.dept_id_idx
NOMONITORING USAGE
和索引相关的数据字典
可以通过查询以下视图获取索引信息:
DBA_INDEXES:提供关于索引的信息。
DBA_IND_COLUMNS:提供关于被索引的列的信息
VSOBJECT_USAGE:提供索引使用情况的信息
13约束
数据完整性
约束类型
非空
1.在列级别定义约束。
2.创建表时使用CREATETABLE来定义约束。下面的示例显示了ORDER_NUM列上的命名约束;对于ORDER_DATE, Oracle生成一个名称。
3.创建表顺序((4)约束nn_order_num not null, order_date date not null, product_id)
使用ALTER TABLE MODIFY可以在现有表的列上添加或删除NOT NULL约束。下面的代码显示了删除约束和添加约束的示例。
ALTER TABLE ORDERS MODIFY ORDER_DATE NULL; ALTER TABLE ORDERS MODIFY PRODUCT_ID NOT NULL;
检查:
它们可以在列级或表级定义。
CHECK子句中指定的条件应该计算为布尔结果,并且可以引用同一行其他列中的值;该条件不能使用查询。
不能使用SYSDATE、USER、USERENV、UID等环境函数和ROWNUM、CURRVAL、NEXTVAL、LEVEL等伪列来评估检查条件。
一个列可以定义多个CHECK约束。该列可以有一个NULL值。
可以使用CREATE TABLE或ALTER TABLE创建。
独特的
可以在列级别为单列唯一键定义它们。对于多列唯一键(复合键-指定的最大列数可以是32),应该在表级别定义约束。
Oracle在唯一键列上创建唯一索引来强制惟一性。如果表上已经存在一个唯一索引或非唯一索引,并且索引中有相同的列,Oracle将使用现有的索引。要使用现有的非唯一索引,表必须不包含任何重复的键。
唯一约束允许约束列中的NULL值。
可以为创建键时创建的隐式索引指定存储空间。如果没有指定存储空间,则在默认表空间上使用该表空间的默认存储参数创建索引。您可以指定LOGGING和NOSORT子句,就像创建索引时一样。创建的索引可以是本地索引,也可以是全局分区索引。索引将具有与唯一约束相同的名称。下面是两个例子。第一个定义了一个包含两列的唯一约束,并为索引指定了存储参数。第二个示例向EMP表添加一个新列,并在列级别创建一个唯一键。
ALTER TABLE BONUS ADD CONSTRAINT UQ_EMP_ID UNQUE (DEPT, EMP_ID) USING INDEX TABLESPACE INDX STORAGE (INITIAL 32K NEXT 32K PCTINCREASE 0); ALTER TABLE EMP ADD SSN VARCHAR2 (11) CONSTRAINT UQ_SSN UNIQUE;
主键:
UNIQUE键的所有特征都适用,除了在主键列中不允许使用NULL值。
一个表只能有一个主键。
Oracle为键中的每一列创建一个唯一的索引和NOT NULL约束。如果主键的所有列都在索引中,Oracle可以使用现有索引。下面的示例在创建表时定义一个主键。
为表和主键索引指定存储参数。为强制执行唯一键和主键而创建的索引可以像任何其他索引一样进行管理。但是,不能显式删除这些索引。
外键
外键是在其中创建约束的表(子表)中的一个或多个列;被引用的键是主键、唯一键列或约束引用的表(父表)中的列。以下规则适用于外键约束:
可以在列级或表级定义外键约束。在表级别定义多列外键。
外键列和引用键列可以在同一个表中(自引用完整性约束)。
外键列中允许使用NULL值。下面是在CITY表的COUNTRY_CODE和STATE_CODE列上创建外键约束的示例,该约束引用STATE表(STATE表的复合主键)的COUNTRY_CODE和STATE_CODE列。
ALTER TABLE CITY ADD CONSTRAINT FK_STATE FOREIGN KEY (COUNTRY_CODE, STATE_CODE) REFERENCES STATE (COUNTRY_CODE, STATE_CODE);
NO ACTION(默认)选项指定,如果结果数据违反引用完整性约束,则不能更新或删除引用的键值。例如,如果一个主键值被外键中的一个值引用,那么由于依赖数据,被引用的主键值不能被删除。
DELETE CASCADE当包含引用键值的行被删除时,删除级联,导致子表中具有依赖外键值的所有行也被删除。例如,如果父表中的一行被删除,并且该行的主键值被子表中的一个或多个外键值引用,则子表中引用主键值的行也将从子表中删除。
DELETE将包含引用键值的行设置为空,导致子表中具有依赖外键值的所有行将这些值设置为空。例如,如果employee_id在TMp表中引用了manager_id,那么删除一个管理器将导致为该管理器工作的所有员工的行将其manager_id值设置为空。
ON DELETE子句指定了当父表中的一行被删除并且子行存在且父主键被删除时所采取的操作。您可以删除子行(CASCADE)或将外键列的值设置为NULL (set NULL)。如果省略此子句,如果存在子记录,Oracle将不允许从父表删除。必须先删除子行,然后再删除父行。下面是在外键中指定删除操作的两个示例。
ALTER TABLE CITY ADD CONSTAINT FK_STATE FOREIGN KEY (COUNTRY_CODE, STATE_CODE) REFERENCES STATE (COUNTRY_CODE, STATE_CODE) ON DELETE CASCADE; ALTER TABLE COTY ADD CONSTAINT FK_STATE FOREIGN KEY (COUNTRY_CODE, STATE_CODE) REFERENCES STATE (COUNTRY_CODE, STATE_CODE) ON DELETE SET NNULL;
创建禁用的约束(约束的两种情况)
当您创建约束时,它将自动启用。通过在约束定义后指定disabled关键字,可以创建已禁用的约束。例如:
ALTER TABLE CITY ADD CONSTRAINT FK_STATE FOREIGN KEY (COUNIRY_CODE, STATE_CODE) REFERENCES STATE (COUNTRY_CODE,STATE_CODE) DISALCE; ALTER TABLE BONUS ADD CONSTRAINT CK_BONUS CHECK (BONUS > 0) DISABLE;
删除约束
要删除约束,可以使用ALTER TABLE。您可以通过指定约束名称来删除任何约束。
ALTER TABLE BONUS DROP CONSTRAINT CK_BONUS2;
要删除带有引用外键的唯一键约束,请指定CASCADE子句来删除外键约束和唯一约束。指定唯一的键列。例如:
ALTER TABLE EMPLOYEE DROP UNIQUE (EMP_ID) CASCADE;
要删除带有引用外键约束的主键约束,请使用CASCADE子句删除所有外键约束,然后删除主键。
ALTER TABLE BONUS DROP PRIMARY KEY CASCADE;
约束状态
完整性约束的有效使用:一个过程按
照以下顺序使用完整性约束状态可以确保获得最佳效益:
1. 禁用状态。
2. 执行操作(加载、导出、导入)。
3.启用novalidate状态。
4. 启用状态。
按此顺序使用约束的一些好处是:
没有锁被持有
。所有约束都可以并发地进入启用状态。
约束启用是并行完成的。
允许在表上并发活动。
nondeferred约束立即检查
deferred约束可以延迟检查
immediate VS deferred
使用SET CONSTRAINTS语句将约束设置为DEFERRED或IMMEDIATE。
ALTER SESSION语句也有将约束设置为DEFERRED或IMMEDIATE的子句。即时vs延迟使用SET CONSTRAINTS语句将约束设置为DEFERRED或IMMEDIATE。ALTER SESSION语句也有将约束设置为DEFERRED或IMMEDIATE的子句。
并发外键
创建TB时的约束
CREATE TABLE hr.employee(
id NUMBER(7)
CONSTRAINT employee_id_pk PRIMARY KEY
DEFERRABLE
USING INDEX
STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx
last_name VARCHAR2(25)
CONSTRAINT employee_last_name_nn NOT NULL,
dept id NUMBER(7))
TABLESPACE users;
约束指引
主要和唯一的约束:
将索引放在单独的表空间中。
如果批量加载频繁,请使用非唯一索引。
Self-referencing外键:
在初始加载后定义或启用外键。
推迟约束检查。
启用约束
启用 NOVALIDATE
表没有锁
主键和唯一键必须使用非唯一索引
ALTER TABLE hr.departments ENABLE NOVALIDATE CONSTRAINT dept_pk;
启用VALIDATE
锁定表
可以使用唯一的或nonunique索引
需要有效的表数据
ALTER TABLE hr.employees ENABLE VALIDATE CONSTRAINT emp_dept_fk;
重命名约束
使用以下命令重命名约束:
ALTER TABLE employees RENAME CONSTRAINT emp_dept_fk TO employees_dept_fk;
使用exceptions表
通过运行utlexpt1创建EXCEPTIONS表。sql脚本。
执行带有EXCEPTIONS选项的ALTER TABLE语句。
在EXCEPTIONS上使用子查询来定位包含无效数据的行。
纠正错误。
重新执行ALTER TABLE以启用约束。
约束的数据字典
可以通过查询以下视图获取约束信息:
DBA_CONSTRAINTS
DBA_CONS_COLUMNS