可以创建没有索引的验证约束/主键吗?

时间:2012-01-03 20:49:00

标签: oracle indexing constraints

我正在进行数据迁移项目,其中一些表只会加载一次。 即只使用一个Select From Insert Into即可完全加载表。

我想通过使用主键和约束来确保数据完整性。

使用Oracle,当我创建主键或约束时,Oracle将自动为我创建相应的索引。

是否可以禁用索引的创建?请注意,我仍然希望根据需要验证约束...因此,在Oracle实际需要进行验证的情况下,它将创建索引(根据需要)...或执行全表扫描

我想要禁用或推迟创建索引的原因是,我注意到创建的大多数索引(对于约束)实际上并没有被使用。我这样做是为所有索引启用Usage Monitoring,运行数据迁移过程,然后验证v $ object_usage。

2 个答案:

答案 0 :(得分:4)

Oracle使用唯一索引来强制执行主键约束。除非您在禁用状态下创建主键,否则无法在没有创建相应索引的情况下创建主键,在这种情况下,除非您启用它,否则不会强制执行主键。

编辑:

如果Oracle可以在主键中使用的列上使用索引,那么Oracle将使用该索引来强制执行约束,无论是否唯一。如果Oracle必须创建索引,那么它将是唯一的,除非约束是可延迟的,在这种情况下它将是非唯一的。感谢Shannon和Adam的评论。

答案 1 :(得分:0)

编辑在这个答案中回答问题的位是错误的。

免责声明:我不相信这是明智的

可以在不实际创建主键的情况下复制primary key constraint的操作。这是因为约束,非索引,PK约束的一部分实际上是not null constraintunique constraint的组合,其中可堆叠。然后你没有索引。所以,是的。这是可能的。

可是:

  1. 使用PK 从不的表的想法似乎不太可能。
  2. 在10年前有人决定过度使用PK时,刚刚解决了所造成的问题。
  3. 我强烈建议您沿着正常路线前进并创建主键。空间很便宜,如果你不这样做,你可能会后悔。