Sql Oracle:如何在用户表上添加外键。表中的表名称

Sql Oracle:如何在用户表上添加外键。表中的表名称,sql,oracle,constraints,Sql,Oracle,Constraints,我正在创建一个表,需要在USER_TABLES.table_NAME上添加外键约束 我不太清楚怎么做 我尝试了以下代码行: CONSTRAINT FK_USR_TBLS FOREIGN KEY (TABLE_NAME) REFERENCES USER_TABLES(TABLE_NAME) 但在尝试创建表时出现以下错误: ORA-00904: "TABLE_NAME": invalid identifier 只能对列执行以下操作: [约束[符号]]外键 [索引名称](列名称,…) 参考tbl_

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

我不太清楚怎么做

我尝试了以下代码行:

CONSTRAINT FK_USR_TBLS FOREIGN KEY (TABLE_NAME) REFERENCES USER_TABLES(TABLE_NAME)
但在尝试创建表时出现以下错误:

ORA-00904: "TABLE_NAME": invalid identifier
只能对列执行以下操作:

[约束[符号]]外键 [索引名称](列名称,…) 参考tbl_名称(col_名称,…)

必须在圆括号内说明列名,不能使用表名

还要注意,相应的列必须具有相同的数据类型:

外键和引用键中的相应列必须具有相似的数据类型


此外,用户表是
sys
scheme

的视图部分,用户表是Oracle数据字典中的视图。这里有两个复杂性

我们不能在没有主键的对象上构建外键。由于
user\u tables
是数据字典的一部分,由Oracle管理,因此在不使支持失效的情况下,我们无法以任何方式、形状或形式对其进行更改

但这并不重要,因为我们无法对视图实施约束。当然,我们可以构建主键,但它们必须声明为
禁用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)
/

外键在列上,不在表上。请描述这两个表。我试图创建的表由3列数据类型为
VARCHAR2
的列组成,我试图向用户表添加外键。表名称。@samg请通过描述这两个表来编辑您的问题,这将有助于解决您遇到的问题。顺便说一下,如果您的表名是
user\u tables
,请查看APC提供的答案“table\u name”是user\u tables表中的一列。@samg对应的列必须具有相同的数据类型,sys.user\u tables也是一个视图“父表和子表必须使用相同的存储引擎。“那么,如果我需要在这个特定列上创建这样的约束,我应该怎么做呢?@APC Thank you,删除了不相关的comment@APC我标记了您的答案,但在测试时,物化视图与用户_表的更改不同步(MV refresh给出12504错误),因此没有提供我预期的值。