【问题标题】:Why oracle doesn't allow creating fk on unique index? [closed]为什么 oracle 不允许在唯一索引上创建 fk? [关闭]
【发布时间】:2020-03-30 06:31:36
【问题描述】:

我试图在 oracle 中创建一个 fk,但遇到了 ORA-02270 问题。 经过一番谷歌搜索,我发现原因是您无法针对唯一索引创建 fk。它必须是唯一的约束。

我也读过 Oracle unique constraint and unique index 它很好地解释了索引和约束是不同的东西。

我不明白的是,为什么 oracle 不允许在唯一索引上创建 fk?我认为这是完全合理的。另外,我也试过Postgres,这样做没有问题。

【问题讨论】:

  • 只有 Oracle 产品经理才能回答这个问题。但他们确实有记录,他们更喜欢对经理来说很酷的功能,而不是那些对开发人员有帮助的功能。

标签: oracle foreign-keys unique-index


【解决方案1】:

约束是 SQL 标准和关系理论的一部分。索引不是。它可能是标准的一部分,但它不是。但是,如果它是标准的一部分,那么标准仍然不应该混淆两个层次——抽象关系接口与其应该独立的实现。 SQL 说 FK(外键)引用 UNIQUE 或 PK(主键)。因此,如果 DBMS 符合要求,您就必须这样做。但是当你声明一个 UNIQUE 约束时,DBMS 会给你一个隐式的唯一索引。 (当你声明一个 PK 约束时,DBMS 会给你一个隐式 UNIQUE NOT NULL 约束和隐式对应索引。)

【讨论】:

    【解决方案2】:

    外键约束总是引用 oracle 中的primary/unique constraint

    如果您看到 USER_CONSTRAINTS 视图,那么您将看到外键约束的 R_CONSTRAINT_NAME。它是PRIMARY/UNIQUE 约束名称。它不是唯一索引。

    select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'R';
    

    唯一索引是与TABLE 完全不同的实体,您必须注意INDEX 的语法也不属于CREATE TABLE 内联语法。

    这就是 oracle 的操作方式,如果您想在创建 UNIQUE index 的列上创建 FK,那么我认为您不会介意在列上创建 UNIQUE constraint 而不是 UNIQUE index ( Oracle 将在创建 UNIQUE constraint 的列上内部创建 UNIQUE index。所以两者都是相同的)但 Oracle 必须需要将约束放置在 R_CONSTRAINT_NAME 中以进行外键约束。(使用R_CONSTRAINT_NAME 的示例)

    【讨论】:

      猜你喜欢
      • 2013-03-12
      • 2017-02-01
      • 2015-03-03
      • 2013-08-16
      • 1970-01-01
      • 2021-12-30
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多