Синтаксис для создания индекса внешнего ключа, встроенного в оператор создания таблицы - PullRequest
2 голосов
/ 27 февраля 2020

Я хочу создать таблицу bar с ограничением именованного внешнего ключа, подкрепленным именованным индексом. Я хотел бы сделать это с помощью встроенного определения в инструкции 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, но я бы очень хотел, чтобы он был аккуратным и аккуратным.

Ответы [ 2 ]

3 голосов
/ 27 февраля 2020

Мне известно, что обходной путь заключается в создании вспомогательного индекса в отдельном выражении DDL, но я бы очень хотел, чтобы он был аккуратным и аккуратным.

К сожалению, синтаксис для создания индексов не существует.

Предложение USING INDEX имеет вид syntacti c sugar: Oracle создает индексы для принудительного применения ограничений Первичный ключ и Уникальный независимо от того, включаем ли мы это предложение (*) . Это связано с тем, что для реализации уникальных ограничений Oracle необходим индекс. Но для индексации внешнего ключа такой необходимости не требуется, просто желательно.


(*) Если на ограниченном столбце (столбцах) не существует существующего индекса, который Oracle можно использовать.

2 голосов
/ 27 февраля 2020

Согласно Oracle документации :

Вы можете указать using_index_clause только при включении ограничений уникального или первичного ключа

Вы не можете указать это условие для NOT NULL, внешний ключ или проверка ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...