oracle:物化视图中的主键列

Posted

技术标签:

【中文标题】oracle:物化视图中的主键列【英文标题】:oracle: primary key column in a materialized view 【发布时间】:2018-09-14 17:34:31 【问题描述】:

任务是在某个唯一列上创建具有主键的物化视图,以便可以将物化视图复制到另一个数据库。问题是没有唯一的列,因为我必须连接大量的表,所以我不能使用连接表中的 ID,因为它们在我的物化视图中不再是唯一的。

首先我要创建一个视图,因为select里面有子查询:

CREATE VIEW V_CONTRACTS
AS

SELECT 
     ID.NEXTVAL,
     C.*
FROM (SELECT <lots of columns>
      FROM CONTRACT
      <lots of joins>
      WHERE <some filters>) C
;

但是报错了:

ORA-02287: sequence number not allowed here

然后我将物化视图创建为:

CREATE MATERIALIZED VIEW CONTRACTS
AS
SELECT * FROM V_CONTRACTS;

【问题讨论】:

为什么不组合唯一列来创建复合主键? 为什么需要视图?一个垫子视图可以有子查询。 【参考方案1】:

您可以使用 ROW_NUMBER 分析函数为您提供一个数字列。

CREATE VIEW V_TEST
AS

SELECT 
     ROW_NUMBER() OVER ( ORDER BY col1 , col2 ) as idx,
     C.*
FROM ( SELECT 'A' as col1, 'B' as col2 FROM DUAL
       UNION
       SELECT 'C' as col1, 'D' as col2 FROM DUAL
       UNION
       SELECT 'E' as col1, 'F' as col2 FROM DUAL
     ) C ;

CREATE MATERIALIZED VIEW mv_test
AS     
SELECT * FROM V_TEST ;   

SELECT * FROM mv_test ;

【讨论】:

以上是关于oracle:物化视图中的主键列的主要内容,如果未能解决你的问题,请参考以下文章

Mysql:如何使物化视图中的列成为主键

Oracle 11x 中增量刷新的物化视图和相应的主表日志

在Postgres中的物化视图上创建主键

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

Oracle DB表与视图的关系(物化视图)

Oracle - 物化视图中的视图