在创建索引的同时创建外键也是正确的命令吗?我收到 ORA-01735:无效的 ALTER TABLE 选项

问题描述 投票:0回答:1

正确与否?

alter table test
add constraint test_fk foreign key (prim_id)
references prim (prim_id)
using index 
(create index i_test_prim_fk 
on test(prim_id) tablespace index01)
on delete cascade
/

也许这里不允许使用索引?

使用索引 * 第 4 行错误: ORA-01735: 无效的 ALTER TABLE 选项

尝试创建fk预期错误

oracle indexing foreign-keys syntax-error sqlplus
1个回答
0
投票

最好的检查方法是阅读文档。

ALTER TABLE
具有 语法:

ALTER TABLE syntax diagram

constraint_clauses::=

constraint clauses syntax diagram

out_of_line_ref_constraint::=

Out-of-line referential constraint syntax diagram

references_clause::=

References clause syntax diagram

constraint_state::=

Constraint state syntax diagram

using_index::=

Using index clause syntax diagram

然后

CREATE INDEX
语法是 here

using_index
子句指定以下限制:

using_index_clause

仅在启用唯一键或主键约束时才可以指定

using_index_clause
。您可以按任意顺序指定
using_index_clause
的子句,但每个子句只能指定一次。

如果指定

schema.index
,则 Oracle 会尝试使用指定索引强制执行约束。如果 Oracle 找不到索引或无法使用索引来强制执行约束,则 Oracle 将返回错误。

如果指定

create_index_statement
,则 Oracle 会尝试创建索引并使用它来强制执行约束。如果 Oracle 无法创建索引或无法使用索引来强制执行约束,则 Oracle 将返回错误。

如果您既不指定现有索引也不创建新索引,则 Oracle 会创建该索引。在这种情况下:

  • 索引与约束具有相同的名称。
  • 如果表已分区,则可以为唯一或主键约束指定本地或全局分区索引。

限制
using_index_clause

以下限制适用于 using_index_clause:

  • 您不能为视图约束指定此子句。
  • 您不能为 NOT NULL、外键或检查约束指定此子句。
  • 启用索引组织表的主键时,不能指定索引 (
    schema.index
    ) 或创建索引 (
    create_index_statement
    )。
  • 您无法指定
    parallel_clause
    中的
    index_attributes
  • INDEXTYPE IS ...
    index_properties
    子句在约束定义中无效。

不,您的声明无效,因为:

  1. ON DELETE CASCADE
    应位于
    USING INDEX
    之前。
  2. USING INDEX
    应创建唯一索引或主键索引。
  3. 唯一索引应该位于
    prim
    而不是
    test

您可以使用两个语句:

ALTER TABLE prim
  ADD CONSTRAINT pk__prim__prim_id
    PRIMARY KEY (prim_id)
    USING INDEX (CREATE UNIQUE INDEX i__prim__prim_id__u ON prim(prim_id))
/

alter table test
  add constraint test_fk
      foreign key (prim_id)
      references prim (prim_id)
      on delete cascade
/
© www.soinside.com 2019 - 2024. All rights reserved.