为什么 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 约束和隐式对应的索引。)
我试图在 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 约束和隐式对应的索引。)