如何在Oracle视图中添加主键?

如何在Oracle视图中添加主键?,oracle,view,primary-key,Oracle,View,Primary Key,可能重复: 我正在使用的软件需要Oracle视图中的主键。是否可以在Oracle视图中添加主键?如果是,如何进行?我无法用谷歌搜索有关这方面的信息。我唯一想到的是使用物化视图,然后在其上创建一个唯一的索引: drop materialized view tq84_mat_view; drop table tq84_table; create table tq84_table ( a number, b number ); create materialized view tq84_m

可能重复:


我正在使用的软件需要Oracle视图中的主键。是否可以在Oracle视图中添加主键?如果是,如何进行?我无法用谷歌搜索有关这方面的信息。

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

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

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

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

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

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

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

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

这是在视图中添加主键的方法

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;

这是在视图中添加主键的方法

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;

那没有道理。视图不包含数据,它没有索引或键。物化视图可以有主键,但我不知道这是否是您想要使用的?您可以根据UNNI的注释进行尝试,可以向视图添加禁用的主键或其他类型的约束。可以这样做以向优化人员提供信息。查看并搜索视图上的约束。这没有意义。视图不包含数据,它没有索引或键。物化视图可以有主键,但我不知道这是否是您想要使用的?您可以根据UNNI的注释进行尝试,可以向视图添加禁用的主键或其他类型的约束。可以这样做以向优化人员提供信息。查看并搜索视图上的约束。它允许约束,但仅在禁用状态下允许约束。他们向乐观主义者提供信息,但不能强制执行。正是托尼所说的。一些进行对象关系映射的工具希望视图中存在禁用的主键和外键,否则它们会生成可怕的执行计划。我们在Hibernate的一个版本中有过这样的经历,不记得是哪一个版本。它允许它们,但只允许处于禁用状态。他们向乐观主义者提供信息,但不能强制执行。正是托尼所说的。一些进行对象关系映射的工具希望视图中存在禁用的主键和外键,否则它们会生成可怕的执行计划。我们在Hibernate的一个版本中有过这样的经历,不记得是哪一个版本。当OP说主键时,我怀疑他们指的是主键约束。此外,ROWNUM不能保证每次运行查询时都是相同的,因此它不适合作为代理主键;即使您假设该表永远不会接收插入或删除。@Jeffrey Kemp我完全同意您的看法,ROWNUM不能保证,但您可以通过使用“alter view VU_NAME add constraint vemp_pk Primary_key disable”命令来进行主约束。我的问题仍然没有回答,为什么他想在他的视图中有一个主键当OP说主键时,我怀疑他们的意思是主键约束。此外,ROWNUM不能保证每次运行查询时都是相同的,因此它不适合作为代理主键;即使您假设该表永远不会接收插入或删除。@Jeffrey Kemp我完全同意您的看法,ROWNUM不能保证,但您可以通过使用“alter view VU_NAME add constraint vemp_pk Primary_key disable”命令来进行主约束。我的问题仍然没有得到回答,为什么他想在他的观点中有一个主键