Oracle: Как добавить внешний ключ для USER_TABLES.TABLE_NAME в таблице - PullRequest
0 голосов
/ 26 августа 2018

Я создаю таблицу, и мне нужно добавить ограничение внешнего ключа для USER_TABLES.TABLE_NAME.

Я не совсем уверен, как это сделать?

Я попробовал следующую строку кода:

CONSTRAINT FK_USR_TBLS FOREIGN KEY (TABLE_NAME) REFERENCES USER_TABLES(TABLE_NAME)

Но получил следующую ошибку при попытке создать таблицу:

ORA-00904: "TABLE_NAME": invalid identifier

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

user_tables - представление в словаре данных Oracle. Здесь есть две сложности.

Мы не можем создавать внешние ключи на объектах, у которых нет первичного ключа. Поскольку user_tables является частью словаря данных и управляется Oracle, мы не можем изменить его каким-либо образом, в какой-либо форме или форме без аннулирования поддержки.

Но это не имеет значения, потому что мы не можем применять ограничения к представлениям. Конечно, мы можем создавать первичные ключи, но они должны быть объявлены как DISABLE NOVALIDATE. Это означает, что мы не можем ссылаться на ограничение во внешнем ключе таблицы.

У вас есть немного странное требование, но если вы хотите построить таблицу, которая навязывает связь со словарем данных, вы можете сделать это с материализованным представлением. Примерно так:

create materialized view my_tables
as
select table_name from user_tables
/

alter materialized view my_tables 
    add constraint my_tables_uk unique (table_name)
/

create table t42 (id number, table_name varchar2(30))
/

alter table t42 
    add constraint t42_tname_fk foreign key (table_name) 
    references my_tables(table_name)
/
0 голосов
/ 26 августа 2018

FOREIGN KEY может быть сделано только для столбцов:

[CONSTRAINT [символ]] FOREIGN KEY [index_name] (col_name, ...) ССЫЛКИ tbl_name(col_name, ...)

Вы должны указать имя столбца (ов) в круглых скобках, вы не можете использовать имя таблицы

Также обратите внимание, что соответствующие столбцы должны иметь одинаковыетипы данных:

Соответствующие столбцы во внешнем ключе и ссылочном ключе должны иметь одинаковые типы данных.

Также USER_TABLES является частью представления sys схемы

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