Oracle:如何在表中的USER_TABLES.TABLE_NAME上添加外键

sam*_*amg 3 sql oracle constraints

我正在创建一个表,我需要在USER_TABLES.TABLE_NAME上添加一个外键约束.

我不太清楚该怎么做?

我尝试了以下代码行:

CONSTRAINT FK_USR_TBLS FOREIGN KEY (TABLE_NAME) REFERENCES USER_TABLES(TABLE_NAME)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试创建表时出现以下错误:

ORA-00904: "TABLE_NAME": invalid identifier
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 7

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)
/
Run Code Online (Sandbox Code Playgroud)