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

Oracle 是否可以创建没有索引的验证约束/主键?,oracle,indexing,constraints,Oracle,Indexing,Constraints,我正在进行一个数据迁移项目,其中一些表将只加载一次。 也就是说,仅使用一个Select From Insert Into即可完全加载表格 我希望通过使用主键和约束来确保数据的完整性 使用Oracle,每当我创建主键或约束时,Oracle都会自动为我创建相应的索引 是否可以禁用索引的创建?请注意,我仍然希望根据需要验证约束。。。因此,在Oracle实际需要进行验证的情况下,它可能会(根据需要)创建索引。。或者进行全表扫描 我想禁用或延迟此索引创建的原因是,我注意到创建的大多数索引(用于约束)实际上

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

我希望通过使用主键和约束来确保数据的完整性

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

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


我想禁用或延迟此索引创建的原因是,我注意到创建的大多数索引(用于约束)实际上没有被使用。为此,我对所有索引启用使用情况监视,运行数据迁移过程,然后验证v$object_的使用情况。

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

编辑:


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

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

编辑:


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

编辑此答案中回答问题的部分是错误的

免责声明:我认为这不明智

可以复制
主键约束的动作
,而无需实际创建主键。这是因为PK约束的非索引约束部分实际上是可堆叠的
非空约束
唯一约束
的组合。然后就没有索引了。所以,是的。这是可能的

但是:

  • 使用PK从不使用的表的想法似乎不太可能
  • 大约10年前,当有人认为对PKs过于花哨是个好主意时,我不得不解决由此产生的问题

  • 我强烈建议您按照常规路线创建主键。空间很便宜,如果你不这样做,你以后可能会后悔的。

    EDIT这个答案中回答问题的部分是错误的

    免责声明:我认为这不明智

    可以复制
    主键约束的动作
    ,而无需实际创建主键。这是因为PK约束的非索引约束部分实际上是可堆叠的
    非空约束
    唯一约束
    的组合。然后就没有索引了。所以,是的。这是可能的

    但是:

  • 使用PK从不使用的表的想法似乎不太可能
  • 大约10年前,当有人认为对PKs过于花哨是个好主意时,我不得不解决由此产生的问题

  • 我强烈建议您按照常规路线创建主键。空间很便宜,如果你不这样做,你以后可能会后悔。

    我的2美分:约束的概念是检查约束。要检查约束,您确实需要使用索引。因此,要么不创建约束(手动检查,要么使用db触发器),要么接受索引的创建。我认为在我的情况下,它实际上没有被检查(至少它没有使用索引)。我猜发生的事情是,当我执行insert时,Oracle跳过了约束检查,因为我直接从相应的表加载外键(因此在这种情况下,不需要实际执行约束检查,因为Oracle知道匹配记录确实存在)。幸运的是,Oracle不允许您(或任何其他人)使用监控只检查在查询过程中是否使用了索引来获取数据;当用于验证唯一、主键或外键约束时,它不包括索引的使用。要检查约束,您确实需要使用索引。因此,要么不创建约束(手动检查,要么使用db触发器),要么接受索引的创建。我认为在我的情况下,它实际上没有被检查(至少它没有使用索引)。我猜发生的事情是,当我执行insert时,Oracle跳过了约束检查,因为我直接从相应的表加载外键(因此在这种情况下,不需要实际执行约束检查,因为Oracle知道匹配记录确实存在)。幸运的是,Oracle不允许您(或任何其他人)使用监控只检查在查询过程中是否使用了索引来获取数据;它不包括用于验证唯一、主键或外键约束时的索引使用。唯一约束也会生成索引,除非可以使用现有索引。Ach@ShannonSeverance,你说得对;我从来都不知道