为什么 oracle 不允许在唯一索引上创建 fk?

Why oracle doesn't allow creating fk on unique index?

我试图在 oracle 中创建一个 fk,但 运行 遇到了 ORA-02270 问题。 经过一番谷歌搜索后,我发现原因是您无法为唯一索引创建 fk。它需要是唯一约束。

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

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

外键约束总是引用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 的示例对其进行了简化)

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