如何在 Oracle 视图上添加主键? [复制]

Posted

技术标签:

【中文标题】如何在 Oracle 视图上添加主键? [复制]【英文标题】:How to add a Primary Key on a Oracle view? [duplicate] 【发布时间】:2011-01-12 11:18:59 【问题描述】:

可能重复:adding primary key to sql view

我正在使用需要 Oracle 视图中的主键的软件。可以在 Oracle 视图中添加主键吗?如果是,如何?我无法在 Google 上搜索这方面的信息。

【问题讨论】:

这没有意义。视图不包含数据,它没有索引或键。 物化视图可以有一个主键,不知道你是不是要这样用? 你可以试试这个***.com/questions/2041308/… 根据 UNNI 的评论,可以向视图添加禁用的主键(或其他类型)约束。可以这样做以向优化器提供信息。请参阅download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/… 并搜索“视图约束”。 【参考方案1】:

不幸的是,SQL 标准只允许对基表进行 UNIQUE 和 PRIMARY KEY 约束,而不是视图。 Oracle 允许在物化视图上使用唯一索引,但通常不允许在视图上使用。

【讨论】:

它允许它们,但仅限于禁用状态。它们向优化器提供信息,但无法强制执行。 正是托尼所说的。一些进行对象关系映射的工具希望那些禁用的主键和外键存在于视图中,或者它们会生成可怕的执行计划。我们曾在 Hibernate 的一个版本中体验过,不记得是哪个版本了。【参考方案2】:

我唯一想到的是使用物化视图,然后在其上创建唯一索引:

drop materialized view tq84_mat_view;
drop table tq84_table;
create table tq84_table (
  a number,
  b number
);

create materialized view tq84_mat_view 
refresh on commit as
select 
  a,
  sum(b) sum_b
from 
  tq84_table
group by
  a;

create unique index tq84_mat_view_uix on tq84_mat_view (sum_b);

insert into tq84_table values (1, 1);
insert into tq84_table values (2, 2);
insert into tq84_table values (1, 4);

commit;

insert into tq84_table values (2, 3);

commit;
--> ORA-12008: error in materialized view refresh path
--> ORA-00001: unique constraint (SPEZMDBA.TQ84_MAT_VIEW_UIX) violated

虽然这可能很有用,但必须记住,与“普通”视图相反,物化视图会占用表空间中的空间。当然,索引也需要空间。

【讨论】:

【参考方案3】:

这是您可以在视图中添加主键的方式。

CREATE OR REPLACE FORCE VIEW VU_NAME
        (
          PRIMARY_KEY, NAME_ID, ADDRESS_ID
         )
        AS 
        SELECT DISTINCT ROWNUM AS PRIMARY_KEY,
            NAME.ID UNIT_ID,
            ADDRESS_ID
        from table1;

【讨论】:

当 OP 说“主键”时,我怀疑他们的意思是“主键 约束”。还有,ROWNUM不保证每次查询都一样,所以不适合作为代理主键;即使您假设该表永远不会收到插入或删除。 @Jeffrey Kemp 我完全同意您的观点,即不能保证 ROWNUM,但始终可以通过使用此命令“更改视图 VU_NAME 添加约束 vemp_pk 主键 (PRIMARY_KEY) 禁用”来设置主约束。我的问题仍然没有得到解答,他为什么要在他的视图中拥有一个主键

以上是关于如何在 Oracle 视图上添加主键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从实体框架中的 Oracle 视图未添加。不是主键

实体框架中的 Oracle 物化视图问题

Oracle SQL 主键卡住

Oracle如何添加主键约束

如何在我的警报视图上添加笑脸? [复制]

sql如何创建视图?