ORACLE DataBase:VIEW在联合两个具有非可空列的表之后具有可空列

时间:2018-02-01 07:43:37

标签: sql oracle sql-view

在Oracle数据库中:

我需要视图中的`<% if flash[:notice].present? %> <script> $(document).ready(function(){ $('#myModal').modal("show"); }); </script> <% end %>` 列不可为空。 该视图是两个表的PRODUCT_ID,列UNION中的每个表都不可为空。 但由于某种原因,该专栏是nullalbe。

语法:

PRODUCT_ID

感谢帮助者

1 个答案:

答案 0 :(得分:0)

问题是,您的视图不是可更新的视图。它是只读的,因为底层查询是两个表的UNION。

如果你有这样的观点

create or replace view view_2
    (PRODUCT_ID
    , PRODUCT_NAME)
as
SELECT MAP_DATA.PRODUCT_ID, MAP_DATA.PRODUCT_NAME
FROM  TABLE_2 MAP_DATA
with check option
/

然后all_tab_cols 'VIEW_2'的{​​{1}}查询会显示nullable='N'。这是因为Oracle可以使用基础表中的列直接映射视图中的列。它不能用UNIONed查询做到这一点(因为一个表的列可以为空,而另一个表是必需的,这是完全可以接受的)。

使用简单视图,我们可以直接对视图执行insert语句。但是,由于显而易见的原因,我们不能用你这样的观点做到这一点(新记录应该在哪个表中?)。为了使视图可更新,我们需要编写一个INSTEAD OF触发器,我们可以在其中强制执行我们需要的任何业务规则。

Oracle允许我们在视图上指定主键和唯一约束(使用魔术RELY DISABLE NOVALIDATE子句,但不是NOT NULL(即检查)约束。

请注意,即使我们使用如下主键定义视图,该列仍然可以为空:

create or replace view view_1
(PRODUCT_ID
, PRODUCT_NAME
, constraint v1_pk primary key (product_id) rely disable novalidate
)
as
SELECT MAP_DATA.PRODUCT_ID
       , MAP_DATA.PRODUCT_NAME

FROM (
    select PRODUCT_ID , PRODUCT_NAME
    FROM TABLE_1

    UNION 

    SELECT PRODUCT_ID , PRODUCT_NAME
    FROM TABLE_2
      ) MAP_DATA
 with check option
/