Внешний ключ с распознавателем - PullRequest
0 голосов
/ 15 марта 2019

У меня есть одна таблица STATUSES, содержащая статусы для нескольких таблиц:

TABLE_NAME | STATUS_ID | STATUS_NAME
===========+===========+============
TAB_1      |         1 | New
TAB_1      |         2 | Started
TAB_1      |         3 | Complete
TAB_2      |         1 | Empty
TAB_2      |         2 | Full

Таблица STATUSES имеет первичный ключ из двух столбцов (table_name, status_id).

Тогда у меня есть таблица TAB_1:

ID | STATUS_ID | TAB_VALUE
===+===========+==========
 1 |         1 | Value1

Когда я хочу получить значения таблицы со статусом, я использую следующий запрос SQL:

SELECT id,tab_value,status_name
FROM tab_1 t
JOIN statuses s ON (s.status_id=t.status_id AND s.table_name='TAB_1')

Теперь я хотел бы создать внешний ключ от TAB_1 до STATUSES, но STATUS_ID долженотличаться от имени таблицы!

Я попробовал вот что:

ALTER TABLE tab_1
ADD CONSTRAINT tab_1_status_fk FOREIGN KEY ('TAB_1',status_id)
REFERENCES statuses (table_name,status_id)
ENABLE;

Конечно, это не работает (иначе меня бы здесь не было).

Можно ли создать такой внешний ключ с помощью «различителя»?

1 Ответ

2 голосов
/ 15 марта 2019

Думаю, я бы добавил имя таблицы в виде виртуального столбца с постоянным значением, например,

alter table tab_1 add (table_name as ('TAB_1'));

, а затем создал бы fk, используя это

ALTER TABLE tab_1
ADD CONSTRAINT tab_1_status_fk FOREIGN KEY (table_name,status_id)
REFERENCES statuses (table_name,status_id)
ENABLE;

Редактировать: Есливы на 12c или выше, вы можете сделать виртуальный столбец скрытым;Я думаю, что это все еще будет работать с FK ...

alter table tab_1 add (table_name invisible as ('TAB_1'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...