2

我想创建一个bar具有命名索引支持的命名外键约束的表。我想在 create table DDL 语句中使用内联定义来做到这一点。查看Oracle 19 SQL 语言参考时,Oracle 应该支持内联执行此操作。

执行以下语句时...

create table foo (
    id number not null primary key
);

create table bar (
    id     number not null primary key,
    nick   varchar2(16) not null constraint foo_nick_ck unique using index,
    foo_id number not null constraint foo_fk references foo using index
);

Oracle 将响应并指向最后一行的[42000][907] ORA-00907: missing right parenthesis之前的位置。using index如果我删除using index它可以工作(但当然没有创建索引)。我将该列nick作为一个示例,说明它可以在何处创建内联支持索引,但用于唯一约束而不是外键约束。

我知道一种解决方法是在单独的 DDL 语句中创建支持索引,但我非常希望它内联整洁。

4

2 回答 2

3

我知道一种解决方法是在单独的 DDL 语句中创建支持索引,但我非常希望它内联整洁。

不幸的是,不存在内联创建索引的语法。

USING INDEX 子句是语法糖:Oracle 创建索引以强制执行主键和唯一约束,无论我们是否包含该子句(*)。这是因为索引对于 Oracle 执行唯一约束是必需的。但是没有必要使用索引来强制执行外键,这只是可取的。


(*)除非 Oracle 可以使用的受约束列上存在现有索引。

于 2020-02-27T15:46:54.330 回答
2

根据Oracle 文档

只能在启用唯一键或主键约束时指定 using_index_clause

您不能为NOT NULL外键或检查约束指定此子句。

于 2020-02-27T15:47:36.150 回答