在 create table 语句中内联创建外键索引的语法

Posted

技术标签:

【中文标题】在 create table 语句中内联创建外键索引的语法【英文标题】:Syntax for creating foreign key index inline in create table statement 【发布时间】:2020-06-11 15:56:57 【问题描述】:

我想创建一个表bar,其具有由命名索引支持的命名外键约束。我想在 create table DDL 语句中使用内联定义来做到这一点。查看Oracle 19 SQL Language Reference 时,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 语句中创建支持索引,但我非常希望它内联整洁。

【问题讨论】:

【参考方案1】:

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

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

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


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

【讨论】:

感谢您的解释!我希望我也能接受你的回答!【参考方案2】:

根据Oracle documentation:

只有在启用 unique 或 主键约束

您不能为 NOT NULL外键 或 检查约束。

【讨论】:

以上是关于在 create table 语句中内联创建外键索引的语法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的多表设计

未创建外键

错误代码: 1005 Can't create table 'hibernate.bill' (errno: 150)

CREATE TABLE 语句中的语法错误

是否可以在 db2 中的 create table 语句本身中定义索引?

Laravel 8 - 用户表中的两个外键