我正在进行数据迁移项目,其中一些表只会加载一次 . 即只使用一个Select From Insert Into即可完全加载表格 .
我想通过使用主键和约束来确保数据完整性 .
使用Oracle,当我创建主键或约束时,Oracle将自动为我创建相应的索引 .
是否可以禁用索引的创建?请注意,我仍然希望根据需要验证约束...因此,在Oracle实际需要进行验证的情况下,它将创建索引(根据需要)...或执行全表扫描 .
我想要禁用或推迟创建索引的原因是我注意到创建的大多数索引(用于约束)实际上并没有被使用 . 我通过打开所有索引的Usage Monitoring,运行数据迁移过程,然后验证v $ object_usage来实现此目的 .
2 回答
Oracle使用唯一索引来强制执行主键约束 . 除非您在禁用状态下创建主键,否则无法在没有创建相应索引的情况下创建主键,在这种情况下,除非您启用主键,否则不会强制执行主键 .
编辑:
如果Oracle可以在主键中使用的列上使用索引,那么Oracle将使用该索引来强制执行约束,无论是否唯一 . 如果Oracle必须创建索引,那么它将是唯一的,除非约束是可延迟的,在这种情况下它将是非唯一的 . 感谢Shannon和Adam的评论 .
EDIT 在这个答案中回答问题的位错了 .
免责声明:我不相信这是明智的
可以在不实际创建主键的情况下复制主键约束的操作 . 这是因为PK约束的约束非索引部分实际上是非空约束和唯一约束的组合,它们是可堆叠的 . 然后你没有索引 . 所以,是的 . 这是可能的 .
但:
使用PK的表的想法似乎不太可能 .
刚刚必须解决当有人认为过于喜欢PK时所产生的问题在10年前是一个好主意 .
我强烈建议你沿着正常路线前进并创建一个主键 . 空间很便宜,如果你不这样做,你可能会后悔 .