首页 文章

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

提问于
浏览
1

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

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

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

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

我想要禁用或推迟创建索引的原因是我注意到创建的大多数索引(用于约束)实际上并没有被使用 . 我通过打开所有索引的Usage Monitoring,运行数据迁移过程,然后验证v $ object_usage来实现此目的 .

2 回答

  • 0

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

    编辑:

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

  • 4

    EDIT 在这个答案中回答问题的位错了 .

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

    可以在不实际创建主键的情况下复制主键约束的操作 . 这是因为PK约束的约束非索引部分实际上是非空约束和唯一约束的组合,它们是可堆叠的 . 然后你没有索引 . 所以,是的 . 这是可能的 .

    但:

    • 使用PK的表的想法似乎不太可能 .

    • 刚刚必须解决当有人认为过于喜欢PK时所产生的问题在10年前是一个好主意 .

    我强烈建议你沿着正常路线前进并创建一个主键 . 空间很便宜,如果你不这样做,你可能会后悔 .

相关问题