在 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 语句中内联创建外键索引的语法的主要内容,如果未能解决你的问题,请参考以下文章
错误代码: 1005 Can't create table 'hibernate.bill' (errno: 150)