带区分符的外键

时间:2019-03-15 17:34:30

标签: sql database oracle

我有一个表状态,其中包含更多表的状态:

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;

当然,这是行不通的(否则我不会在这里)。

是否可以用“ distinguisher”创建这样的外键?

1 个答案:

答案 0 :(得分:2)

我想我会将表名添加为具有常量值的虚拟列,例如

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'));